extglob 否定未按预期工作

extglob 否定未按预期工作

我试图使用否定来排除目录,但目录仍然出现在模式匹配中:

bash-4.3$ ls
file_1.txt  testdir
bash-4.3$ shopt extglob
extglob         on
bash-4.3$ echo !(*/)
file_1.txt testdir
bash-4.3$ 

我到底做错了什么?

注意:我知道我可以使用for循环[find命令,但我想extglob具体弄清楚。

答案1

你不能/@(...), !(...), *(...)...

只能/出现在 glob 之间,甚至a[x/y]b被视为@(a\[x)/@(y\]b).首先将 glob 进行拆分/,并将每个部分与目录的内容进行匹配。然而,当存在ksh glob 扩展名时,内部的x(...)不会被分割,但每个 glob 部分仍然与文件名匹配。 In ,与当前目录中的每个文件名相匹配。显然,没有文件名可能包含,因此它不匹配任何内容,因此匹配每个文件。/(...)!(*/*)*/*/!(*/*)

在这里,您需要使用zsh及其 glob 限定符:

echo *(^/)

适用于除目录之外的任何类型的文件。或者与bash's相反*/(这是目录类型的任何文件符号链接解析后):

echo *(-^/)

(既不是目录也不是目录符号链接的文件)。

相关内容