递归全局?

Pao*_*olo 119 shell bash recursive wildcards

我想写这样的东西:

$ ls **.py
Run Code Online (Sandbox Code Playgroud)

为了获得所有 .py 文件名,递归遍历目录层次结构。

即使要查找 .py 文件,shell (bash) 也会给出以下输出:

ls: cannot access **.py: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做我想做的事吗?

编辑:我想说明我对 的特定情况不感兴趣ls,但问题是关于 glob 语法。

jor*_*anm 145

为了在 bash 中执行递归 glob,您需要globstarbash 版本 4 或更高版本的功能。

从 bash 联机帮助页:

globstar
    If set, the pattern ** used in a pathname expansion context will
    match all files and zero or more directories and subdirectories.
    If the pattern is followed by a /, only directories and
    subdirectories match.
Run Code Online (Sandbox Code Playgroud)

对于您的示例模式:

shopt -s globstar
ls -d -- **/*.py
Run Code Online (Sandbox Code Playgroud)

  • @glennjackman 但在启用 `nullglob` 之前,我强烈建议阅读以下 [警告](http://mywiki.wooledge.org/NullGlob)。 (7认同)
  • 使用 bash 3.2,`wc -l {**,.}/*.py` 工作得很好 (3认同)
  • 我还建议启用 `nullglob` (2认同)
  • ^ 警告已移至 [此处](http://mywiki.wooledge.org/glob#Warning)。 (2认同)

don*_*l24 18

find . -name '*.py'
Run Code Online (Sandbox Code Playgroud)

** 只做一个 * ,都在当前目录下操作

  • @Doug O'Neal,这不再是真的。bash 现在已经复制了 zsh 特性(尽管它采用了更接近于 ksh93 的语法,并且像 ksh 一样,不支持 zsh 的通配符限定符,这限制了它的实用性) (2认同)

ken*_*orb 14

自 Bash 4(也包括 zsh)以来,添加了一个新的通配选项( globstar) **,它在设置模式时会以不同的方式处理模式。

它匹配通配符模式并返回匹配的文件和目录名称,然后将命令中的通配符模式替换为匹配的项目。

通常,当您使用 时**,它的工作方式类似于*,但它会递归地递归所有目录(如循环)。

要查看它是否已启用,请检查它shopt globstar(在脚本中,使用shopt -q globstar)。

该示例**.py仅适用于当前目录,因为它不返回可以递归的目录列表,因此您需要使用多个目录级通配符**/*.py,以便它可以更深入。

在此处查看递归查找文件的示例。

  • 谢谢!globstar 可以通过``shopt -s globstar`` 启用。 (4认同)