Linux BASH extglob negate没有像我期望的那样工作

Linux BASH extglob negate没有像我期望的那样工作,linux,bash,Linux,Bash,假设我有下面的dir结构 ./testdir ./testdir/a.c ./testdir/b.c ./testdir/testdir2/ ./testdir/t.tar 假设我的CWD是testdir,我想回显所有没有.tar扩展名的目录条目 这项工作: echo *.!(tar) 然而,我预计这将产生相同的结果,但它没有: echo *!(tar) 第二个命令中只缺少句点。第二个echo命令列出了d.tar文件。星号glob字符应该匹配所有字符,extglob negate应该列出任

假设我有下面的dir结构

./testdir
./testdir/a.c
./testdir/b.c
./testdir/testdir2/
./testdir/t.tar
假设我的CWD是testdir,我想回显所有没有.tar扩展名的目录条目

这项工作:

echo *.!(tar)
然而,我预计这将产生相同的结果,但它没有:

echo *!(tar)

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

让我们从这些文件开始:

$ ls
a.b  b.c  testdir2  t.tar
这将匹配具有句点但在句点之后没有tar的所有文件:

$ echo *.!(tar)
a.b b.c
这将匹配所有不以tar结尾的文件:

这是一个令人惊讶但不应该:

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

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

让我们从以下文件开始:

$ ls
a.b  b.c  testdir2  t.tar
这将匹配具有句点但在句点之后没有tar的所有文件:

$ echo *.!(tar)
a.b b.c
这将匹配所有不以tar结尾的文件:

这是一个令人惊讶但不应该:

$ echo *!(tar)
a.b b.c testdir2 t.tar
*本身可以匹配任何东西,例如t.tar。因为没有必要在t.tar之后添加tar,所以这是一个匹配项。

和!tar位不是相交的互补全局集

它们形成一个必须扩展的单一球体

我猜t.tar火柴就是t.tar火柴,还有火柴!焦油

你想要的球是*焦油任何与*焦油球不匹配的东西。

和!tar位不是相交的互补全局集

它们形成一个必须扩展的单一球体

我猜t.tar火柴就是t.tar火柴,还有火柴!焦油


你想要的球是*焦油任何与*tar glob不匹配的内容。

这个答案很有帮助。很容易错误地认为星号glob字符与某些正则表达式规则集中使用的*相同。这里的教训:不要混淆Regex*和BASH*。他们不一样。这个答案很有帮助。很容易错误地认为星号glob字符与某些正则表达式规则集中使用的*相同。这里的教训:不要混淆Regex*和BASH*。他们不一样。这个答案对我来说是最有用的,不使用它是一个明显的错误*用词代替!这个答案对我来说是最有用的,不使用它是一个明显的错误*用词代替!话又说回来…如果我决定的话,我会接受这个