1つのファイル拡張子を維持し、別のファイル拡張子を削除する方法は?

1つのファイル拡張子を維持し、別のファイル拡張子を削除する方法は?

.tr0私のディレクトリに、、、、、、、.scsなど.mt0.ic0多く.log.st0ファイル拡張子があります.pa0

他のすべての拡張機能を維持.tr0して削除したいです。.scs

交換するための効果的な方法はありますか?

rm *.mt0 *.ic0 *.log *.st0 *.pa0 

答え1

フロント:

find . ! \( -name '*.tr0' -o -name '*.scs' \) -type f -exec echo rm -f {} +

echo(コマンドを実行したい場合は削除してください)

findあなたがサポートしている場合-delete

find . ! \( -name '*.tr0' -o -name '*.scs' \) -type f -delete

上記のコマンドは再帰的に機能します。現在のディレクトリにのみ存在するには、次の手順を実行します。

find . ! -name . -prune ! \( -name '*.tr0' -o -name '*.scs' \) -type f

答え2

シェルオプション()または次bashを有効にするなど、拡張ワイルドカードパターンを許可するシェルで:extglobshopt -s extglobksh93

rm ./*.!(tr0|scs)

拡張シェルワイルドカードパターンは、!(pattern-list)-delimitedで指定されたパターンを除くすべてのパターンと一致します。|pattern-list


ドットが含まれる場合、パターンはディレクトリ名とも一致しますが、rmディレクトリはデフォルトで削除されないため、いくつかのエラーメッセージのみが表示されます。

この問題を解決するには、一致する各名前をテストして通常のファイルを参照していることを確認するループを使用できます。

for name in ./*.!(tr0|scs); do
    [ -f "$name" ] && rm "$name"
done

関連情報