次の方法でファイルのリストがあります。
> file1.jpg
> file1_orig.jpg
> file2.jpg
> file2_orig.jpg
拡張子が_orig.jpgのすべてのファイルを保持し、拡張子のないファイルを削除したいと思います。 Bashを使用してどのようにこれを達成できますか?
ベストアンサー1
Bashが利用可能拡張子ファイル名拡張子:
rm !(*_orig.jpg)
文法!(pattern)
:
与えられたパターンの1つを除くすべてと一致します。
したがって、これは一致しないすべてのファイル名に拡張され、*_orig.jpg
削除することができます(または邪魔にならない場所に移動する可能性があります)。このオプションを有効にする必要がありますextglob
。shopt -s extglob
(そうしないと、「イベントが見つかりません」という形式のエラーが発生します)が、通常はデフォルトで有効になっています。
あるいは、一時的にアーカイブしたいファイルだけを移動し、残りの部分を削除することもできます。
mkdir tmp
mv *_orig.jpg tmp
rm *.jpg
mv tmp/*.jpg .
rmdir tmp
使用するオプションがありますfind
さらに:
find . -type f ! -name '*_orig.jpg' -exec rm '{}' +
これは、現在のディレクトリで名前のない(一般)ファイルを再帰的に見つけて*_orig.jpg
削除します。ファイルがすべて1つのディレクトリに直接存在しない場合は、これが最良のオプションです。