一尘不染

如何以广度优先的方式递归列出某个位置的所有目录?

linux

在此,广度优先的列表很重要。而且,限制搜索的深度将是很好的。

$ find . -type d
/foo
/foo/subfoo
/foo/subfoo/subsub
/foo/subfoo/subsub/subsubsub
/bar
/bar/subbar

$ find . -type d -depth
/foo/subfoo/subsub/subsubsub
/foo/subfoo/subsub
/foo/subfoo
/foo
/bar/subbar
/bar

$ < what goes here? >
/foo
/bar
/foo/subfoo
/bar/subbar
/foo/subfoo/subsub
/foo/subfoo/subsub/subsubsub

如果可能的话,我想使用bash单线执行此操作。如果有一个javascript-shell,我会想像

bash("find . -type d").sort( function (x) x.findall(/\//g).length; )

阅读 315

收藏
2020-06-07

共1个答案

一尘不染

find命令支持-printf可识别大量占位符的选项。

这样的占位符之一就是%d呈现给定路径相对于find起点的深度。

因此,您可以使用以下简单的单线:

find -type d -printf '%d\t%P\n' | sort -r -nk1 | cut -f2-

它非常简单,并且不依赖于像这样的繁重工具perl

怎么运行的:

  • 它在内部生成文件列表,每个文件显示为两行
  • 第一个字段包含深度,深度用于(反向)数字排序,然后切掉
  • 结果是简单的文件列表,每行一个文件,以最深优先顺序排列
2020-06-07