Bash
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
你不能
/
在@(...)
,!(...)
,*(...)
…
/
只能出現在 glob 之間,甚至被a[x/y]b
視為@(a\[x)/@(y\]b)
. glob 首先被拆分/
,每個部分都與目錄的內容相匹配。但是,當有ksh glob 副檔名時, .內x(...)
的 沒有拆分,但每個 glob 部分仍然與文件名匹配。In ,與目前目錄中的每個文件名匹配。顯然,沒有文件名可能包含 a ,因此它不匹配任何內容,因此匹配每個文件。/``(...)``!(*/*)``*/*``/``!(*/*)
在這裡,您要使用
zsh
及其 glob 限定符:echo *(^/)
對於除目錄以外的任何類型的文件。或者與
bash
’s (這是符號連結解析後*/
的任何類型目錄的文件)相反:echo *(-^/)
(既不是目錄也不是目錄符號連結的文件)。