ワイルドカードはmypackage*.tar.xzと一致しますが、mypackage*fast.tar.xzと一致しませんか?

ワイルドカードはmypackage*.tar.xzと一致しますが、mypackage*fast.tar.xzと一致しませんか?

プロジェクトをビルドする前に、ディレクトリにある既存のバイナリを削除したいと思います。今、ディレクトリには2つのファイルmypackage-<version>-fast.tar.xzmypackage-<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経由で有効にする)、次のことができます。kshshopt -s extglobbash

rm mypackage-!(*-fast).tar.xz

上記のファイル名ワイルドカードパターン部分は、一致する文字!(*-fast)列を除くすべての文字列と一致します*-fast

zshKSH_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

関連情報