特定のパターンに一致するすべてのファイルを削除するbashコマンドを作成しようとしています。この場合、これは、構築された古いvmwareログファイルのすべてです。
私はこのコマンドを試しました:
find . -name vmware-*.log | xargs rm
ただし、コマンドを実行すると、名前にスペースが含まれているすべてのフォルダーが表示されなくなります。 xargsがそれをrm引用符付きで渡すか、適切にエスケープするようにファイルパスをフォーマットする方法はありますか?
find
に-exec
オプションを使用する方が簡単で混乱が少ないことが一般的にわかります。これを試して:
find . -name vmware-*.log -exec rm -i {} \;
-exec
の後のすべては、;
までの各結果に対して実行するコマンドと見なされ、find
に渡されるようにここでエスケープされます。 {}
は、find
が通常印刷するファイル名に置き換えられます。
期待どおりに動作することを確認したら、-i
を削除できます。
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
に渡す前に展開しようとする場合があります。 。
検索の-delete
オプションを忘れないでください。特殊文字を含むエラーなしでファイルを削除します...