当前位置 : 主页 > 编程语言 > python >

powershell/python_shell编写可以指定递归深度的powershell tree命令/ls递归遍历符号链接

来源:互联网 收集:自由互联 发布时间:2022-06-14
文章目录 ​​ls(get-childItem)递归遍历符号链接symlink​​ ​​powershell version(no tree branch)​​ ​​示例效果​​ ​​powershell tree_pwsh(with tree branch)​​ ​​效果​​ ​​updating version​​


文章目录

  • ​​ls(get-childItem)递归遍历符号链接symlink​​
  • ​​powershell version(no tree branch)​​
  • ​​示例效果​​
  • ​​powershell tree_pwsh(with tree branch)​​
  • ​​效果​​
  • ​​updating version​​
  • ​​preview​​
  • ​​old version​​
  • ​​效果​​
  • ​​使用方式​​

ls(get-childItem)递归遍历符号链接symlink

-FollowSymlink <System.Management.Automation.SwitchParameter>
By default, the `Get-ChildItem` cmdlet displays symbolic links to directories found during recursion, but doesn't recurse into them. Use the FollowSymlink parameter to search the
directories that target those symbolic links. The FollowSymlink is a dynamic parameter and is supported only in the FileSystem provider.
## powershell version
  • 默认情况下,​​ls -R​​不会遍历到符号链接/junction link所指的目录
  • 明白这一点在某些情况下很重要(特别是下文中的模拟tree的函数)
  • 该版本也是默认不会遍历进入符号链接,不过,您可以指定​​-FollowSymlink​​来迫使遍历能够访问符号链接所指向的目录

powershell version(no tree branch)

  • 可以自行修改或者结合管道符进行更高级的处理
function recurseTree
{
# Closure function
<#
.synopsis
本函数支持遍历目录和文件
也可以选择仅遍历目录而部列出文件
通过缩进来表示嵌套层次关系
支持指定最大遍历深度;指定为0时,表示不限制深度;默认深度为2层
.example
recurseClosure -traverseType d -maxDepth 3

recurseClosure -traverseType a -maxDepth 3 -path D:\repos\scripts\linuxShellScripts\
排除关键字示例(可以修改-eq为-like / -match 来支持通配符或正则表达式)
recurseTree -exclude "node_modules" -maxDepth 0 |sls -Pattern "Rand.*"
#>

# 参数置顶原则
param(
$traverseType = '',
$path = './',
$maxDepth = '2',
$exclude = ''
)

$depth = 1
$times = 0
function listRecurse
{
<# 遍历所有子目录 #>
param(
$traverseType = '',
$path = ''
)
# Write-Output "`tpath=$path"
if ($traverseType -eq 'd')
{
$lst = (Get-ChildItem -Directory $path)
}
else
{
$lst = (Get-ChildItem $path)

}

# 子目录数目len
$len = $lst.Length
$times++;

#每一层处理都是都是一重循环O(n)

# 遍历子目录
<# 注意需要添加对文件的判断,否则在对文件调用本函数的时候,会陷入死循环(无法进入深层目录) #>
$lst | ForEach-Object {
$len--;
# Write-Output "`t`t remain times :len=$len";
if ($_.BaseName -like $exclude)
{
# pass it
}
else
{

# 打印每个子目录及其深度
$indent = "`t" * ($depth - 1)
Write-Output "$indent $depth $($_.FullName)"
# Write-Output "depth=$depth"
if ((Get-Item $_) -is [system.io.directoryinfo] )
{

$depth++
# write
# 对子目录继续深挖,(做相同的调用)
if ($depth -le $maxDepth -or $maxDepth -eq 0)
{
listRecurse -path $_.FullName -traverseType $traverseType
}
$depth--
}
# Write-Output "$depth"
# Start-Sleep -Milliseconds 1000
}
}
}

listRecurse -traverseType $traverseType -path $path
# listRecurse

}

示例效果

PS D:\repos\blogs\neep> recurseTree -maxDepth 3
1 D:\repos\blogs\neep\408
2 D:\repos\blogs\neep\408\ComputerNetwork
3 D:\repos\blogs\neep\408\ComputerNetwork\concepts.md
3 D:\repos\blogs\neep\408\ComputerNetwork\ipv6.md
2 D:\repos\blogs\neep\408\os
3 D:\repos\blogs\neep\408\os\exercise5.md
2 D:\repos\blogs\neep\408\principlesOfCompilers
3 D:\repos\blogs\neep\408\principlesOfCompilers\image
3 D:\repos\blogs\neep\408\principlesOfCompilers\subSet.md
2 D:\repos\blogs\neep\408\principlesOfComputer
3 D:\repos\blogs\neep\408\principlesOfComputer\
3 D:\repos\blogs\neep\408\principlesOfComputer\image
3 D:\repos\blogs\neep\408\principlesOfComputer\1646647596000.png
3 D:\repos\blogs\neep\408\principlesOfComputer\.md
3 D:\repos\blogs\neep\408\principlesOfComputer\.md

powershell tree_pwsh(with tree branch)

function tree_pwsh
{
# Closure function
<#
.synopsis
本函数支持遍历目录和文件
也可以选择仅遍历目录而部列出文件
通过缩进来表示嵌套层次关系
支持指定最大遍历深度;指定为0时,表示不限制深度
.example
recurseClosure -traverseType d -maxDepth 3

recurseClosure -traverseType a -maxDepth 3 -path D:\repos\scripts\linuxShellScripts\
排除关键字示例(可以修改-eq为-like / -match 来支持通配符或正则表达式)
recurseTree -exclude "node_modules" -maxDepth 0 |sls -Pattern "Rand.*"
#>

# 参数置顶原则
param(
$traverseType = '',
$path = './',
$maxDepth = '2',
$exclude = ''
)

$depth = 1
$times = 0
function listRecurse
{
<# 遍历所有子目录 #>
param(
$traverseType = '',
$path = ''
)
# Write-Output "`tpath=$path"
if ($traverseType -eq 'd')
{
$lst = (Get-ChildItem -Directory $path)
}
else
{
$lst = (Get-ChildItem $path)

}

# 子目录数目len
$len = $lst.Length
$times++;

#每一层处理都是都是一重循环O(n)

# 遍历子目录
<# 注意需要添加对文件的判断,否则在对文件调用本函数的时候,会陷入死循环(无法进入深层目录) #>
$lst | ForEach-Object {
$len--;
# Write-Output "`t`t remain times :len=$len";
if ($_.BaseName -like $exclude)
{
# pass it
}
else
{

# 打印每个子目录及其深度
# 无树干的前缀字符串(简洁版)
# $indent = "`t" * ($depth - 1)
# 如果想要画出所有的枝干,需要在intend这段字符串做改进(不单单是合适数量的制表符.)
# 总之,每一行可能有多个`|`:第n层的条目,需要有n条树干线(而且,同一行的内容只能够一次性打印完,)
# 所以,我们应该计算并安排好每一行的前缀字符串(树干线)
# 带树干的字符串
$indent_tree = "|`t" * ($depth - 1)

Write-Output "$indent_tree`\_($depth)$($_.FullName)"
if ((Get-Item $_) -is [system.io.directoryinfo] )
{
# 打印树干
# 其实还要考虑要求打印的深度的截至
if (@(Get-ChildItem $_).Count -gt 0 )
{
# Write-Output @(Get-ChildItem $_).Count
# $branch = '|' + "`t" * ($depth - 1) + ' \____.'
$branch = $indent_tree+ ' \____.'

if ($depth -eq $maxDepth)

{
<# Action to perform if the condition is true #>
$branch += '......'
}
$branch
}

$depth++
# write
# 对子目录继续深挖,(做相同的调用)
if ($depth -le $maxDepth -or $maxDepth -eq 0)
{
listRecurse -path $_.FullName -traverseType $traverseType
}
$depth--
}
# Write-Output "$depth"
# Start-Sleep -Milliseconds 1000
}
}
}

listRecurse -traverseType $traverseType -path $path
# listRecurse

}

效果

powershell/python_shell编写可以指定递归深度的powershell tree命令/ls递归遍历符号链接symlink/仅遍历文件夹/遍历文件和目录/指定遍历深度/如何绘制树干_子目录

updating version

  • 将每层的文件和目录分类(优先答应文件,然后在处理文件夹,使得结果更加紧凑)
""" 
设定一个递归函数travers_dir(dirName,depthStop,...);
该函数支持指定递归的深度;
同时要求能够体现目录间的层次(通过制表符缩进来表达
网友评论