双星号是否包含当前目录?

4
以下问题问道双星号(**)通配符是什么意思? 许多答案表明,**包括当前目录以及子目录。
然而,在Bash控制台中测试时,它似乎只列出子目录中的文件。以下两个都只列出子目录文件。
$ find **/*.md
docs/architecture.md
docs/autodetect.md
# ...

$ ls -d **/*.md
docs/architecture.md
docs/autodetect.md
# ...

尽管当前目录中存在 .md 文件
$ ls -d *.md
CODE_OF_CONDUCT.md  CONTRIBUTING.md  README.md  SECURITY.md

我是否误解了所引用问题的答案,还是我没有正确测试这个模式?
如何确保脚本中的命令作用于当前目录和子目录中的文件?
1个回答

4

需要打开 globstar 选项才能启用对 **/ 的特殊解释。否则,它只是两个相邻的 * 通配符,无法匹配当前目录。

当启用 globstar shell 选项,并且在文件名扩展上下文中使用 * 时,作为单个模式使用的两个相邻的 * 将匹配所有文件和零个或多个目录和子目录。如果后面跟着一个 /,则两个相邻的 * 只会匹配目录和子目录。

这里是默认行为 (shopt -u globstar):

$ ls **/*.md
docs/architecture.md  docs/autodetect.md

当设置 (shopt -s globstar) 后,您将得到以下内容:

$ shopt -s globstar
$ ls **/*.md
CODE_OF_CONDUCT.md  CONTRIBUTING.md  README.md  SECURITY.md  docs/architecture.md  docs/autodetect.md

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接