假设我有以下目录结构
./testdir
./testdir/a.c
./testdir/b.c
./testdir/testdir2/
./testdir/t.tar
并假设我的CWD是testdir,我想回显所有没有.tar扩展名的目录条目。
这有效:
echo *.!(tar)
但是,我预计这会产生相同的结果但不会:
echo *!(tar)
第二个命令只缺少句点。第二个echo命令列出了d.tar文件。星号全局字符应匹配所有字符,而extglob否定应列出任何不以tar结尾的字符。
答案 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的任何内容。