BASH extglob否定了我没想象的工作

时间:2015-04-01 02:44:33

标签: linux bash

假设我有以下目录结构

./testdir
./testdir/a.c
./testdir/b.c
./testdir/testdir2/
./testdir/t.tar

并假设我的CWD是testdir,我想回显所有没有.tar扩展名的目录条目。

这有效:

echo *.!(tar)

但是,我预计这会产生相同的结果但不会:

echo *!(tar)

第二个命令只缺少句点。第二个echo命令列出了d.tar文件。星号全局字符应匹配所有字符,而extglob否定应列出任何不以tar结尾的字符。

2 个答案:

答案 0 :(得分:2)

让我们从这些文件开始:

$ ls
a.b  b.c  testdir2  t.tar

这匹配所有具有句点但在句点后没有tar的文件:

$ echo *.!(tar)
a.b b.c

这匹配所有不以tar结尾的文件:

$ echo !(*tar)
a.b b.c testdir2

这是令人惊讶但不应该出现的外展:

$ echo *!(tar)
a.b b.c testdir2 t.tar

*本身可以匹配任何内容,例如t.tar。由于没有必要在tar之后添加t.tar,因此这是匹配。

答案 1 :(得分:2)

*!(tar)位不是相互交叉的互补整数集。

它们形成一个必须扩展的单个glob。

我猜t.tar匹配t.tar匹配*和""匹配!(tar)

你想要的全球是!(*tar)匹配*tar glob的任何内容。