bash globstar匹配


18

我有这个目录结构:

~/tmp/globstar ɀ  find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

并且,globstar在Bash中启用该选项后,我可以说:

~/tmp/globstar ɀ  ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

我的问题是:为什么dir/file.ext从此列表中排除?

Bash手册这样globstar

如果设置,则在文件名扩展上下文中使用的模式“ **”将匹配所有文件以及零个或多个目录和子目录。如果模式后跟一个'/',则仅目录和子目录匹配。

在本段中,“ ”给我留下dir/file.ext应有的印象;除非我希望错过一些东西。


2
这个角色是什么?ɀ
slm

2
什么版本的bash,在什么平台上?我无法在Debian wheezy上使用bash 4.2.37或在Debian squeeze上使用bash 4.1.5来重现此内容。@slm unicode ɀWikipedia
吉尔(Gilles)'所以别再作恶了'

1
@Gilles这是提示吗?
slm

5
slm,是的!ɀ只是此处用来区分提示的字符。一些用户更喜欢使用字符£而不是$:)。最初,ɀ“ z”字符是为特殊的非洲语言符号创建的:-)
Slyx 2014年

1
OS X 10.9附带的“ GNU bash版本3.2.53(1)-发行版(x86_64-apple-darwin13)”具有此行为。
natevw 2015年

Answers:


8

我猜这仅指子目录级别。**没有/比赛

  1. 所有文件和目录

  2. 零个或多个子目录

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

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


是的,这恰好是我的后备,看起来并不漂亮。;-)
Vlad GURDIGA 2014年

10

在列出的发行版随附的这些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中添加,请参见“ 更改”。在旧版本中,该命令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

2. **/*.ext比赛file.ext

~/tests$ cd dir
~/tests/dir$ ls -1 **/*.ext
file.ext
subdir1/file.ext
subdir2/file.ext

准备用于重现上述测试的环境

mkdir -p dir/subdir{1,2}
touch dir/{,subdir{1,2}/}file.ext
shopt -s globstar

2
这是正确的答案。OP忘记设置shopt -s globstar
CS裴

5

我看起来像是您已关闭全球星号。可以这样打开:

shopt -s globstar

它不仅不匹配零个子目录,而且不匹配两个子目录:

$ 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

关闭globstar时,**的行为与* dir/**/*.ext相同,因此得到的结果与dir/*/*.ext

$ echo dir/*/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext

有时候这会欺骗我,让我以为全球星已开启

像这样检查您当前的globstar设置:

shopt | grep globstar

1
您可以直接检查shell选项设置,如中所示shopt globstar
本杰明W.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.