Linux 的 `find' 实用程序中是否有广度优先/深度优先选项?
答案1
没有内置任何 find 功能,甚至 GNU find 也是如此。您可以对输出进行后处理,以find
按斜杠数排序,例如使用 Perl:
find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
<>
是所有输入行的列表;$a =~ s!/!/!g
是中的斜线数$a
,我们用它作为排序标准。
如果你可以使用 zsh:
echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
**/*
列出当前目录和子目录中的所有文件。- 括号内的内容是 glob 限定符。
- glob 限定符
oe
控制返回匹配的顺序:它们按REPLY
运行此处引号中的代码后的值排序,每个匹配REPLY
最初设置为匹配的路径。 - 上述代码转换
$REPLY
为删除除斜杠之外的所有内容。因此,结果由深度 1 处的所有内容(结果为空)组成$REPLY
,然后是深度 2 处的所有内容($REPLY
最终为/
),深度 3 处的所有内容(//
)等。
答案2
没有
去这个问题寻找解决方法。
答案3
我的感觉是可以的。它涉及 grep 等以及循环,但我发现它工作得很好,特别是对于不需要完成 find 的情况。
由于以下原因,它的资源消耗更大:
- 大量分叉
- 发现很多东西
- 当前深度之前的每个目录都会被 find 命中,次数与文件结构的总深度相同(如果您实际上有任何数量的 RAM,这应该不是问题......)
这是很好的,因为:
- 它使用 bash 和基本的 gnu 工具
- 它可以随时被打破(就像你看到你所寻找的东西飞过一样)
- 它按行而不是按查找进行工作,因此后续命令不必等待查找和排序
- 它基于实际的文件系统分离工作,因此如果您的目录中有斜杠,它将不会被列出得比实际更深;如果您配置了不同的路径分隔符,那么仍然可以。
/bin/bash #!/bin/bash 深度=0 同时查找 -mindepth $depth -maxdepth $depth | grep '.' 做 深度=$((深度+1)) 完毕
您还可以轻松地将其放在一行中:
depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done
但我更喜欢小脚本而不是打字......
答案4
从https://stackoverflow.com/a/23948137/1865272
#!/bin/bash
queue="$1"
shift
while [ -n "$queue" ]
do
echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 $*
queue=`echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 -type d`
done
来自 Jethro Yuhttps://stackoverflow.com/users/542730/jethro-yu