web-dev-qa-db-ja.com

findコマンドを使用してパターンに一致するファイルを削除する方法は?

特定のパターンに一致するすべてのファイルを削除するbashコマンドを作成しようとしています。この場合、これは、構築された古いvmwareログファイルのすべてです。

私はこのコマンドを試しました:

find . -name vmware-*.log | xargs rm

ただし、コマンドを実行すると、名前にスペースが含まれているすべてのフォルダーが表示されなくなります。 xargsがそれをrm引用符付きで渡すか、適切にエスケープするようにファイルパスをフォーマットする方法はありますか?

16
Dan Monego

find-execオプションを使用する方が簡単で混乱が少ないことが一般的にわかります。これを試して:

find . -name vmware-*.log -exec rm -i {} \;

-execの後のすべては、;までの各結果に対して実行するコマンドと見なされ、findに渡されるようにここでエスケープされます。 {}は、findが通常印刷するファイル名に置き換えられます。

期待どおりに動作することを確認したら、-iを削除できます。

19
Jeff Snider

GNU findを使用している場合、-deleteオプション:

find . -name "vmware-*.log" -delete

xargsを使用して、ファイル名にスペースが含まれる問題を回避するには:

find . -name vmware-*.log -print0 | xargs -0 rm

ただし、ログファイルの名前にはスペースを含めないでください。ワープロ文書やMP3ファイルにはそれらが含まれている可能性がありますが、ログファイルの名前を制御できるはずです。

findに出力リストをNULLで区切るように指示でき、xargsに同じように入力リストを受信するよう指示できます。

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

また、バックスラッシュを使用するか、*を単一引用符で囲むことにより、vmware-*.logをエスケープしてください。エスケープしないと、シェルがfindに渡す前に展開しようとする場合があります。 。

8

検索の-deleteオプションを忘れないでください。特殊文字を含むエラーなしでファイルを削除します...

5
Dom