ファイル(さまざまなファイル拡張子)とサブフォルダを含むフォルダがあります。特定のファイル拡張子を保持し、残りを削除したいと思います。
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システムでは、このコマンド(find
GNUを使用するすべての実装が機能します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
で説明されているセキュリティ上の考慮事項他の人が書き込むことができるディレクトリでコマンドを実行している場合。
答え2
忙しい箱find
主張する-regex
ファイルを削除するために使用できるオプションのサポート一致するモデル:
find . -type f -regex '.*\.tmp\|.*\.core' -delete
残念ながら、一般的な場合、-not
オプションのない拡張リストを除外することは不可能です(技術的には解決策があるただし、延長することはできません。)これがまさに-not
このオプションが最初に含まれた理由です。任意の拡張リストを除外する必要がある場合は、find
このオプションをサポートする拡張または++find
が必要です。grep
xargs
find . | grep -v -e '\.jpg$' -e '\.txt$' | xargs rm