Linux
萬用字元匹配 mypackage*.tar.xz 但不匹配 mypackage*fast.tar.xz?
在建構我的項目之前,我希望刪除目錄中任何現有的二進製文件。現在這個目錄包含兩個文件
mypackage-<version>-fast.tar.xz
和mypackage-<version>.tar.xz
. 我只想刪除mypackage-<version>.tar.xz
而不是*fast.tar.xz
文件。執行
rm mypackage-*.tar.xz
會刪除這兩個文件,同時find . -type f ! -name *fast.tar.xz
列出目錄中我不想刪除的其他源文件。
如果你的包的版本總是以數字結尾,你可以使用
rm mypackage-*[0-9].tar.xz
…或者您可以使用一些類似的方式來匹配版本號的結尾,該版本號排除了
-fast
包變體的匹配(甚至可能只是mypackage-*[!t].tar.xz
)。如果這是不可能的,那麼…
假設您正在使用 shell,例如
bash
允許使用擴展ksh
樣式的通配模式(使用shopt -s extglob
in啟用bash
),您可以這樣做rm mypackage-!(*-fast).tar.xz
上面的
!(*-fast)
文件名通配模式部分將匹配除匹配的字元串之外的任何字元串*-fast
。
zsh
如果KSH_GLOB
設置了 shell 選項 (setopt KSH_GLOB
) ,這也可以在shell 中工作。zsh
啟用擴展萬用字元 ( )setopt EXTENDED_GLOB
後,您可以改用rm mypackage-^(*-fast).tar.xz
要另外僅刪除正常文件,請將 glob 限定符添加
(.)
到該文件名通配模式的最後。在
sh
外殼中,您可以使用for name in mypackage-*.tar.xz; do case $name in (mypackage-*-fast.tar.xz) ;; (*) rm "$name"; esac done
或者,
for name in mypackage-*.tar.xz; do case $name in (mypackage-*-fast.tar.xz) continue; esac rm "$name" done
這會遍歷所有匹配
mypackage-*.tar.xz
的名稱,跳過另外匹配的名稱mypackage-*-fast.tar.xz
,並刪除其餘的名稱。