我想写这样的东西:
$ ls **.py
为了获取所有 .py 文件名,递归地遍历目录层次结构。
即使有 .py 文件可供查找,shell (bash) 也会给出以下输出:
ls: cannot access **.py: No such file or directory
有什么办法可以做我想做的事吗?
编辑:我想指出,我对 的具体情况不感兴趣ls
,但问题是关于 glob 语法。
答案1
为了在 bash 中执行递归 glob,您需要globstar
Bash 版本 4 或更高版本的功能。
来自bash 文档:
globstar
**
如果设置,文件名扩展上下文中使用的 模式将匹配所有文件以及零个或多个目录和子目录。如果模式后跟/
,则仅目录和子目录匹配。
对于您的示例模式:
shopt -s globstar
ls -d -- **/*.py
您必须运行shopt -s globstar
才能使其发挥作用。默认情况下,bash 中未启用此功能,通过运行shopt
即可激活该功能。
答案2
find . -name '*.py'
** 只执行一个 * 操作,两者都在当前目录中操作
答案3
从 Bash 4 开始(还包括 zsh)一个新的通配选项添加了( ),它在设置模式时会以不同的方式globstar
处理模式。**
它匹配通配符模式,然后通过用匹配的项目替换命令中的通配符模式来返回匹配的文件和目录名称。
通常,当您使用 时**
,它的工作方式与 类似*
,但它会递归地递归所有目录(就像循环一样)。
要查看它是否已启用,请通过shopt globstar
(在脚本编写中,使用shopt -q globstar
)进行检查。
该示例**.py
仅适用于当前目录,因为它不返回可以递归的目录列表,因此这就是为什么您需要使用多个目录级通配符**/*.py
,以便它可以更深入。
看这里有关递归查找文件的示例。