bash globstar 匹配

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 版本中按您的预期工作:

  • 4.1.2(1) — CentOS 6.5
  • 4.1.5(1) — Debian 6.0.10
  • 4.1.10(4) — Cygwin 1.7.31
  • 4.2.46(1) — CentOS 7.1
  • 4.3.11(1) — Ubuntu 14.04.1
  • 4.3.30(1) — Debian 8.1

事实上,上面列出的版本都是我测试过的。换句话说,我没有发现 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)

  • 这是正确的答案。OP 忘记设置 `shopt -s globstar`。 (2认同)

Hau*_*ing 9

我猜这仅指子目录级别。**没有/火柴

  1. 所有文件和目录

  2. 零个或多个子目录

但它并没有完全消失。**/表示**适用于的最高级别目录中没有文件匹配。

你需要dir/*.ext dir/**/*.ext.


Ale*_*502 8

我看起来就像你已经/关闭了 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)

  • 您可以直接检查 shell 选项设置,如`shopt globstar`。 (2认同)