Bash

extglob 否定沒有按預期工作

  • June 30, 2017

我試圖使用否定從萬用字元中排除目錄,但目錄仍然出現在模式匹配中:

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 *(-^/)

(既不是目錄也不是目錄符號連結的文件)。

引用自:https://unix.stackexchange.com/questions/374326