Answers:
为了在bash中执行递归glob,您需要globstar
bash版本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.
对于您的示例模式:
shopt -s globstar
ls **/*.py
nullglob
,我强烈建议您阅读以下警告。
wc -l {**,.}/*.py
效果很好
find . -name '*.py'
**除了做一个*以外,不做其他任何事情,它们都在当前目录中运行
find
如果没有bash 4,可以做很多事情。示例:(yourcommand `find . -name '*.py'`
注意反引号);find . -name '*.py' -exec yourcommand {} \;
。
自Bash 4(还包括zsh)以来,添加了新的globlob选项(globstar
),该选项**
在设置模式时将以不同的方式处理。
它匹配通配符模式,并返回匹配的文件和目录名称,然后通过用匹配的项替换命令中的通配符模式。
通常,当您使用时**
,它的工作方式类似于*
,但是它以递归方式递归所有目录(如循环)。
要查看是否已启用,请通过shopt globstar
(在脚本中使用shopt -q globstar
)进行检查。
该示例**.py
仅适用于当前目录,因为它不会返回可以递归的目录列表,因此这就是为什么您需要使用多个目录级通配符的原因**/*.py
,因此更深入。
请找到我为递归查找所有文件所做的少量语法测试。
nullglob