Zsh

刪除除一種(或多種)文件類型以外的所有文件類型

  • March 17, 2022

我一直在嘗試找到一個命令來刪除文件夾中的所有文件,但不是一種文件類型。但我似乎沒有任何運氣。到目前為止我已經嘗試過:

set extended_glob
rm !(*.dmg)
# this returns zsh:number expected

rm ./^*.dmg
# this returns no matches found 

我使用的 zsh 版本是zsh 5.0.2 (x86_64-apple-darwin13.0.1).

extended_glob選項為您提供 zsh 自己的擴展glob 語法

setopt extended_glob
rm -- ^*.dmg
rm -- ^*.(dmg|txt)

這將刪除沒有副檔名的文件(例如README)。如果要保留這些文件,可以使用~運算符來限制匹配項:

setopt extended_glob
rm -- *.*~*.dmg

如果您還想刪除子目錄中的文件,您可以使用**遞歸萬用字元。傳遞. glob 限定符以將匹配限制為正常文件,或使用^/而不是.匹配所有非目錄(包括符號連結)。(請注意,rm -r這對您沒有幫助,因為它會刪除目錄及其所有內容,或者根本不會進入目錄。)

rm -- **/^*.(dmg|txt)(.)

您可以設置ksh_glob獲取ksh glob的選項。請注意,在否定模式是單詞中最後一件事的常見情況下,zsh 可能會將括號解析為 glob 限定符(在 ksh 仿真模式下不會這樣做)。

setopt ksh_glob
rm -- !(*.dmg|*.txt)
setopt no_bare_glob_qual
rm -- !(*.dmg)

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