Linux“查找”实用程序中的广度优先选项?


12

Linux`find'实用程序中是否有广度优先/深度优先的选项?

Answers:


5

没有内置的东西可以找到,甚至GNU都找不到。您可以对输出进行后处理find以按斜杠数量进行排序,例如使用Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> 是所有输入行的列表;
  • $a =~ s!/!/!g是中的斜杠数$a,我们将其用作排序标准。

如果可以使用zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* 列出当前目录和子目录中的所有文件。
  • 括号内的内容是全局限定符。
  • glob限定符oe控制返回匹配项的顺序:REPLY在运行代码后,这里对每个匹配项(REPLY最初设置为匹配路径)在引号中按引号后的值进行排序。
  • 所述代码转换$REPLY为删除除斜杠之外的所有内容。因此,结果由深度1的所有内容(空结果$REPLY),深度2的所有内容($REPLY最终为/),深度3的所有内容(//等)组成。

1
排序后的过程非常有趣,但是排序需要完成查找,并且您将没有机会控制中断。
耶吉莱(YièJìléi)2010年


1

我的感觉是可以。它涉及grep等和一个循环,但是我发现它工作得很好,特别是针对您有关不需要完成查找的情况。

由于以下原因,它需要更多的资源:

  • 很多分叉
  • 很多发现
  • 找到当前深度之前的每个目录的次数是文件结构总深度的多少(如果您实际上有任意数量的内存,这应该不是问题...)

这很好,因为:

  • 它使用bash和基本的GNU工具
  • 随时可以打破它(就像您看到要寻找的东西一样)
  • 它按行而不是按查找工作,因此后续命令不必等待查找和排序
  • 它根据实际的文件系统分隔进行工作,因此,如果目录中带有斜杠,则列出的目录不会比其深。如果您配置了其他路径分隔符,则仍然可以。
#!/ 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

但是我更喜欢小脚本而不是打字...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.