Linux 中 `find' 实用程序的广度优先选项?

Linux 中 `find' 实用程序的广度优先选项?

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

相关内容