ビジボックス検索を使用して特定のファイル拡張子を削除(または維持)するには?

ビジボックス検索を使用して特定のファイル拡張子を削除(または維持)するには?

ファイル(さまざまなファイル拡張子)とサブフォルダを含むフォルダがあります。特定のファイル拡張子を保持し、残りを削除したいと思います。

e.g. keep all .txt and .jpg files and delete all other files.

一般的なUNIX / GNUでは、これを達成するために「-not」引数でfindを使用できます。

> find . -not -name "*.jpg" -not -name "*txt" -type f -delete

ただし、残念ながら、このパラメータはbusybox findでは使用できません。

これを行う方法についてのアイデアはありますか?ありがとう

ベストアンサー1

-notそして-deleteそれは非標準拡張です。

-notより短い標準と同等のものがある場合は、使用する理由はありません!

の場合は、述語呼び出しを使用する必要が-deleteあります。rm-exec

find . ! -name '*.jpg' ! -name '*.txt' -type f -exec rm -f '{}' +

-exec rm -f '{}' ';'(以前のバージョンのbusyboxを使用している場合は、ファイルごとに1つずつ実行する必要がありますrm。)

上記のコマンドは標準的なので、busyboxだけでなくGNU以外の最新の実装でも機能しますfind

少なくともGNUシステムでは、このコマンド(findGNUを使用するすべての実装が機能しますfnmatch(3))は、名前の末尾.jpgまたはで終わるいくつかのファイルを削除できます。パターンは、名前に現在無効な文字を含むファイルと一致できない.txtためです。*.jpg場所。

この問題を解決するには、次の手順を実行する必要があります。

LC_ALL=C find . ! -name '*.jpg' ! -name '*.txt' -type f -exec rm -f '{}' +

さらに、GNUとは異なり、この方法は最終的にシステムコールに渡されるファイルパスの最大サイズに達するため、-delete非常に深いディレクトリツリーでは機能しません。unlink()AFAIK、実装が Nor をサポートしていない場合、findこの問題を解決する方法はありません。find-execdir-delete

また、読みたいかもしれませんGNUのマニュアルfindで説明されているセキュリティ上の考慮事項他の人が書き込むことができるディレクトリでコマンドを実行している場合。

おすすめ記事