web-dev-qa-db-ja.com

テンプレートに一致するファイルを検索して削除

大量のフォルダとファイルがあります。私はそれを解析し、拡張子xmpを持つものだけを見つけて、最終的に削除する必要があります。

どうすればこれを達成し、削除されたファイルの名前を追跡できますか?

検索する:find /path -name "*.xmp"しかし、出力で2つのコマンドをどのように実行できますか?ファイルのパスと名前をremovelist.txtを削除します。

3
Kevin Lemaire

GNUfind's-fprintおよび-deleteアクション:

find . -name "*.xmp" -fprint "removelist.txt" -delete
  • -fprint file-完全なファイル名をファイルfileに出力します。 fileの実行時にfindが存在しない場合は、作成されます。存在する場合は切り捨てられます。
  • -delete-ファイルを削除
8
RomanPerekhrest

1つの方法は、-execを使用して複合シェルコマンドを実行することです。

find /path -name '*.xmp' -exec sh -c 'echo "$1" >> removelist.txt && rm -f "$1"' sh {} \;

サブシェル内では、echoremovelist.txtに追加)とrmの両方が、見つかった各ファイルに対して実行されます。

注:最後のshは、-cを使用しているためです。このフラグを使用すると、その後に続く最初の引数はparam 0または$0であり、シェルの名前になるはずです。

Gottaは認めます、@ RomanPerekhrestはこの特定のケースに対してより良い答えを持っていますが、ここでのテクニックで、専用のfindフラグがないかもしれないあらゆる種類のことを行うことができます。 :)

2
B Layer

正常に削除されたファイルをログに記録するには、次のようにします。

find . -name '*.xmp' -exec rm -f {} \; -print > removed.txt

-printアクションは、-execアクションが成功した、つまりrmが成功した場合。

findの実装によっては、-exec rm -f {} \;-deleteファイルごとに1つのコマンドを実行することを避け、いくつかの競合状態を回避します(最初はFreeBSDの拡張機能ですが、GNU findおよび他のいくつかによってサポートされるようになりました)。

2