大量のフォルダとファイルがあります。私はそれを解析し、拡張子xmp
を持つものだけを見つけて、最終的に削除する必要があります。
どうすればこれを達成し、削除されたファイルの名前を追跡できますか?
検索する:find /path -name "*.xmp"
しかし、出力で2つのコマンドをどのように実行できますか?ファイルのパスと名前をremovelist.txt
を削除します。
GNUfind's-fprint
および-delete
アクション:
find . -name "*.xmp" -fprint "removelist.txt" -delete
-fprint file
-完全なファイル名をファイルfile
に出力します。 file
の実行時にfind
が存在しない場合は、作成されます。存在する場合は切り捨てられます。-delete
-ファイルを削除1つの方法は、-exec
を使用して複合シェルコマンドを実行することです。
find /path -name '*.xmp' -exec sh -c 'echo "$1" >> removelist.txt && rm -f "$1"' sh {} \;
サブシェル内では、echo
(removelist.txt
に追加)とrm
の両方が、見つかった各ファイルに対して実行されます。
注:最後のsh
は、-c
を使用しているためです。このフラグを使用すると、その後に続く最初の引数はparam 0または$0
であり、シェルの名前になるはずです。
Gottaは認めます、@ RomanPerekhrestはこの特定のケースに対してより良い答えを持っていますが、ここでのテクニックで、専用のfind
フラグがないかもしれないあらゆる種類のことを行うことができます。 :)
正常に削除されたファイルをログに記録するには、次のようにします。
find . -name '*.xmp' -exec rm -f {} \; -print > removed.txt
-print
アクションは、-exec
アクションが成功した、つまりrm
が成功した場合。
find
の実装によっては、-exec rm -f {} \;
と-delete
ファイルごとに1つのコマンドを実行することを避け、いくつかの競合状態を回避します(最初はFreeBSDの拡張機能ですが、GNU find
および他のいくつかによってサポートされるようになりました)。