首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归全球?

递归全球?
EN

Unix & Linux用户
提问于 2012-10-04 15:30:04
回答 3查看 94.9K关注 0票数 145

我想写这样的东西:

代码语言:javascript
复制
$ ls **.py

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

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

代码语言:javascript
复制
ls: cannot access **.py: No such file or directory

有办法做我想做的事吗?

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

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2012-10-04 15:47:01

为了在bash中执行递归全局,您需要来自Bash 4或更高版本的globstar特性。

来自巴什文档

如果设置了globstar ,则在文件名扩展上下文中使用的模式**将匹配所有文件以及零或多个目录和子目录。如果模式后面跟着一个/,那么只有目录和子目录匹配。

对于您的示例模式:

代码语言:javascript
复制
shopt -s globstar
ls -d -- **/*.py
票数 180
EN

Unix & Linux用户

发布于 2012-10-04 15:41:17

代码语言:javascript
复制
find . -name '*.py'

**只执行一个*,它们都在当前目录中操作。

票数 20
EN

Unix & Linux用户

发布于 2015-04-20 10:07:32

自从Bash 4(也包括zsh)被添加以来,一种新的全球化选择 (globstar)就被添加了,它在设置模式**时会以不同的方式对待它。

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

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

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

示例**.py只适用于当前目录,因为它不返回可以递归的目录列表,因此需要使用多目录级别的通配符**/*.py,因此可以进行更深入的操作。

看这儿用于递归查找文件的示例。

票数 20
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/49913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档