プロジェクトをビルドする前に、ディレクトリにある既存のバイナリを削除したいと思います。今、ディレクトリには2つのファイルmypackage-<version>-fast.tar.xz
とmypackage-<version>.tar.xz
。ファイルを削除するmypackage-<version>.tar.xz
のではなく、削除したいと思います。*fast.tar.xz
実行すると、rm mypackage-*.tar.xz
これら2つのファイルが削除され、find . -type f ! -name *fast.tar.xz
ディレクトリに削除したくない他のソースファイルが一覧表示されます。
答え1
パッケージのバージョンが常に数字で終わる場合は、次のものを使用できます。
rm mypackage-*[0-9].tar.xz
-fast
...または、パッケージバリアント(またはそれ自体)の一致を除いて、バージョン番号の末尾を一致させる同様の方法を使用できますmypackage-*[!t].tar.xz
。
これが不可能な場合...
たとえば、拡張スタイルのグロービングパターンをbash
許可するシェルを使用していると仮定すると(in経由で有効にする)、次のことができます。ksh
shopt -s extglob
bash
rm mypackage-!(*-fast).tar.xz
上記のファイル名ワイルドカードパターン部分は、一致する文字!(*-fast)
列を除くすべての文字列と一致します*-fast
。
zsh
KSH_GLOB
これは、シェルオプション()が設定されている場合にsetopt KSH_GLOB
シェルにも適用されます。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
残りの名前を削除します。
答え2
findコマンドを使用できますが、追加のクエリを指定する必要があります。
find . -type f -name 'mypackage-*.tar.xz' ! -name 'mypackage-*fast.tar.xz'
-delete
その後、さまざまなバージョンのfindで使用されているタスクを使用して、見つかったファイルを削除できます。
find . -type f -name 'mypackage-*.tar.xz' ! -name 'mypackage-*fast.tar.xz' -delete