我试图使用否定来排除目录,但目录仍然出现在模式匹配中:
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 *(-^/)
(既不是目录也不是目录符号链接的文件)。