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


17

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

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

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

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


回答:


20

私は一般に、この-execオプションを使用findすると、より簡単になり、混乱が少なくなります。これを試して:

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

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

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


1
また、ディレクトリではなく削除したいファイルだけであれば、 ''-type f ''をfindコマンドに追加できます。
ジェームズハンナ

18

GNU findを使用している-delete場合は、オプションを使用できます。

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

xargsファイル名のスペースの問題を使用して回避するには:

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

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


それはきちんとしている。私はそれについて知りませんでした。
ジェフスナイダー

8

findNULLで出力リストを区切り、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


6

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.