Vla*_*IGA 19 bash wildcards globstar
我有这个目录结构:
~/tmp/globstar ? find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
Run Code Online (Sandbox Code Playgroud)
而且,globstar
在 Bash 中启用该选项后,我可以说:
~/tmp/globstar ? ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么被dir/file.ext
排除在这个列表之外?
Bash 手册是这样说的globstar
:
如果设置,文件名扩展上下文中使用的模式 '**' 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟一个“/”,则只有目录和子目录匹配。
这一段的“零”让我有一种dir/file.ext
应该被包括在内的印象;除非我希望错过一些东西。
pab*_*ouk 15
这在列出的发行版提供的这些 Bash 版本中按您的预期工作:
事实上,上面列出的版本都是我测试过的。换句话说,我没有发现 Bash 版本 4 不起作用。该选项globstar
是在 Bash 4.0 中添加的,请参阅CHANGES。在旧版本中,该命令shopt -s globstar
应返回错误。
1. dir/**/*.ext
匹配dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
Run Code Online (Sandbox Code Playgroud)
2. **/*.ext
匹配file.ext
:
~/tests$ cd dir
~/tests/dir$ ls -1 **/*.ext
file.ext
subdir1/file.ext
subdir2/file.ext
Run Code Online (Sandbox Code Playgroud)
为重现上述测试准备环境:
mkdir -p dir/subdir{1,2}
touch dir/{,subdir{1,2}/}file.ext
shopt -s globstar
Run Code Online (Sandbox Code Playgroud)
我猜这仅指子目录级别。**
没有/
火柴
所有文件和目录
零个或多个子目录
但它并没有完全消失。**/
表示**
适用于的最高级别目录中没有文件匹配。
你需要dir/*.ext dir/**/*.ext
.
我看起来就像你已经/关闭了 globstar。它可以像这样打开:
shopt -s globstar
Run Code Online (Sandbox Code Playgroud)
它不仅不会匹配零个子目录,而且也不会匹配两个子目录:
$ find dir -type f #the same as yours except with a directory inside one of the subdirectories
dir/file.ext
dir/subdir1/file.ext
dir/subdir1/subsubdir/file.ext
dir/subdir2/file.ext
$ shopt -u globstar #turn globstar off
$ #will only show files in subdirectories
$ #will not show files in dir or in subsubdir
$ echo dir/**/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext
$ shopt -s globstar #turn globstar on
$ #will show all four files
$ echo dir/**/*.ext
dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext
Run Code Online (Sandbox Code Playgroud)
关闭 globstar 后,** 的行为与 * 一样,因此dir/**/*.ext
得到的结果与dir/*/*.ext
$ echo dir/*/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext
Run Code Online (Sandbox Code Playgroud)
有时这让我误以为 globstar 已开启
检查您当前的 globstar 设置,如下所示:
shopt | grep globstar
Run Code Online (Sandbox Code Playgroud)