.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
を有効にするなど、拡張ワイルドカードパターンを許可するシェルで:extglob
shopt -s extglob
ksh93
rm ./*.!(tr0|scs)
拡張シェルワイルドカードパターンは、!(pattern-list)
-delimitedで指定されたパターンを除くすべてのパターンと一致します。|
pattern-list
ドットが含まれる場合、パターンはディレクトリ名とも一致しますが、rm
ディレクトリはデフォルトで削除されないため、いくつかのエラーメッセージのみが表示されます。
この問題を解決するには、一致する各名前をテストして通常のファイルを参照していることを確認するループを使用できます。
for name in ./*.!(tr0|scs); do
[ -f "$name" ] && rm "$name"
done