2009-10-19 8 views
11

特定のパターンに一致するすべてのファイルを削除するbashコマンドを書き込もうとしています。この場合は古いビルドログファイルがすべてビルドされています。シェルスクリプト:xargsでbashを使用する

私は、このコマンドを試してみた:私は、コマンドを実行すると

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

はしかし、それは自分の名前にスペースを持つすべてのフォルダ上にチョーク。 xargsがファイルを引用符で囲まれているか適切にエスケープされているようにファイルパスをフォーマットする方法はありますか?

+0

クロス投稿:http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern –

答えて

24

使用してみてください:

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

これは出力に、各ファイル名の後にヌル文字を見つけ引き起こし、ヌル文字の代わりに、空白や他のトークンに基づいて名前を分割するxargsのを伝えます。

5

-0フラグをxargsに設定してください。 find-print0と組み合わせて設定する必要があります。

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

xargsは使用しないでください。任意の助けを借りずにそれを行うことができます検索:

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

+3

をそれは常に良いことです余分なプロセス、特にxargsに長すぎる何かを提供できるこのようなものを開始することを避けるためです。 'find'でも' -exec ... 'の代わりに 'delete'アクションを使用することができますが、この方法をカスタマイズする方が簡単です。 tcshのような古いシェルを使用していない限り、中括弧を引用する必要もありません。 – Cascabel

+3

しかし、これは、 'xargs'のように' rm'にいくつかのファイル名を渡すのではなく、個々のファイルに対して 'rm'プロセスを個別に起動するので遅くなります。 – JaakkoK

+5

@jk:そのため、新しいfindの実装では 'find -exec rm '{}' +'があり、 'xargs'のように引数をバッチアップします。 – ephemient

1

find . -name vmware-*.log | xargs -i rm -rf {}

0
find -iname pattern 

使用-inameを見つけるI改行文字をsepとして使用する-dオプションを使用してarator:

find . -name vmware-*.log | xargs -d '\n' rm 
0

はxargsの中にスペースの問題を回避するためにパターン検索のための

find . -name vmware-*.log -delete 
関連する問題