Linux で find コマンドを使用して結果セットから特定のファイルを削除するにはどうすればよいですか?

Linux で find コマンドを使用して結果セットから特定のファイルを削除するにはどうすればよいですか?

拡張子が 、 などのすべてのファイルを一覧表示する次のコマンドがありdocますdocx

find . -maxdepth 1 -iname \*.doc\*

このコマンドは多数のファイルを返しますが、そのうちのいくつかは削除したいものです。例えば、返される結果は次のようになります。

  1. 例.docx
  2. ダミーデータ.doc
  3. サンプル.doc

Sample.doc と Dummydata.docx を削除したいのですが、オプションを使用してファイルを削除するにはどうすればよいですか-exec。ファイル名を渡すことはできますか。rm Dummydata.docx Sample.docその場合、コマンドは次のようになります。

find . -maxdepth 1 -iname \*.doc\* -exec rm Dummydata.docx Sample.doc

{} afterrm`内でファイル名を渡せますか?例:

find . -maxdepth 1 -iname \*.doc\* -exec rm {Dummydata.docx} Sample.doc

もっと良い方法はあるでしょうか?

答え1

事前にファイル名がわかっている場合は、すぐに削除する方が簡単です。

find . -iname "Dummydata.doc" -delete

または、複数の条件がある場合:

find . \( -iname "Dummydata.doc" -o -iname "Sample.doc" \)

括弧は優先順位を強制しますが、通常、括弧はシェルに対して特別な意味を持つため、括弧をエスケープするか引用符で囲む必要があります。


あるいは、最初に結果のリストを調べたい場合は、見つかったファイルのパス(ここでは に入力{})を に渡すことができますshshコマンドの場合、パスは になり$0、削除するファイルの名前と比較できます。

find . -maxdepth 1 -iname "*.doc" \
-exec sh -c 'if [ "$0" == "Dummydata.doc" ] || [ "$0" == "Sample.doc" ]; then echo rm "$0"; fi' {} \;

ここで、echo正しいファイルが削除されることが確実になったら削除します。ただし、手動でファイルを削除する方が簡単だと思います。

関連情報