Linux

萬用字元匹配 mypackage*.tar.xz 但不匹配 mypackage*fast.tar.xz?

  • May 24, 2020

在建構我的項目之前,我希望刪除目錄中任何現有的二進製文件。現在這個目錄包含兩個文件mypackage-<version>-fast.tar.xzmypackage-<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 extglobin啟用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,並刪除其餘的名稱。

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