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

问题描述 投票:29回答:9

宽度优先列表很重要,在这里。此外,限制搜索的深度也不错。

$ 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; )
linux bash shell ksh
9个回答
30
投票

[find命令支持-printf选项,该选项可识别很多占位符。

一个这样的占位符是%d,它呈现给定路径相对于find起始位置的深度。

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

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

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

它的工作方式:

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

23
投票

如果您想使用标准工具来执行此操作,则以下管道应该起作用:

find . -type d | perl -lne 'print tr:/::, " $_"' | sort -n | cut -d' ' -f2

即,

  1. 在这里先查找并打印所有目录,先按顺序排列>>
  2. 计算每个目录中的斜线数并将其添加到路径前
  3. 按深度排序(即,斜线数)
  4. 仅提取路径。
  5. 要限制找到的深度,请将-maxdepth参数添加到find命令。

如果要以相同的顺序列出目录以找到它们,请使用“ sort -n -s”代替“ sort -n”; “ -s”标志可稳定排序(即,在比较比较的项目之间保留输入顺序)。


7
投票

您可以使用find命令,查找/ path / to / dir -type d因此,下面是当前目录中的目录列表示例:


5
投票

我认为您无法使用内置实用程序来完成此操作,因为遍历目录层次结构时,您几乎总是需要深度优先搜索,无论是自上而下还是自下而上。这是一个Python脚本,它将为您提供广度优先的搜索:


5
投票

我的感觉是,这是比前面提到的解决方案更好的解决方案。它涉及grep等和一个循环,但我发现它工作得很好,特别是在您希望行缓冲而不是整个查找缓冲的情况下。


3
投票

我试图找到一种方法来使用find执行此操作,但似乎没有-breadth选项。如果没有为此编写补丁,请尝试以下shell咒语(适用于bash):


2
投票

没有应有的顺序:找到-maxdepth -type d


1
投票

这是使用查找的一种可能方法。我尚未对其进行彻底的测试,因此请用户注意...


0
投票

类似这样的东西:

© www.soinside.com 2019 - 2024. All rights reserved.