it-mure.jp.net

空白を含むファイルを再帰的に削除するにはどうすればよいですか?

Ubuntuのbashでこのコマンドに問題があります:

rm $(find . -name "*.exe")

私の目的は、.exeで終わるすべてのファイルを再帰的に削除することです。ただし、一部のファイルには空白があり、これによりコマンドが中断されます。

この問題に取り組む方法について何か提案はありますか?

6
Dr Beco
find . -name "*.exe" -exec rm -f '{}' +

これには find コマンドと引数の形式があり、名前の操作を慎重に回避します(それぞれを個別の引数としてrmに渡すことにより)。 「+」は、「rmの1回の実行でできるだけ多くのことを実行する」ことを意味します。

17

出力をfindからxargsにパイプして、ファイル名間の区切り文字として改行のみを考慮するように指定できます。

find -name '*.exe' | xargs -d \\n rm

これを行うためのより移植性の高い方法は、区切り文字としてnull文字を使用することです。

find -name '*.exe' -print0 | xargs -0 /bin/rm

これを行う例については、findのマンページを参照してください。

別のオプションは、使用したコマンドを使用することですが、bashの内部引数区切り文字を改行のみに設定します。

IFS=$'\n'; rm $(find . -name "*.exe");

ここで$'...' quoting構文は、改行文字を作成するために使用されます。このアプローチは、ファイル名のリストが長い場合、xargsを使用する場合よりも回復力が低くなります。

3
intuited

-deleteオプションをfindに渡すだけです。

find . -name "*.exe" -delete

これにより、引用やその他のファイル名の煩わしさがなくなり、新しいプロセスを生成する必要がないため、おそらく-execよりも高速になります。

1
mainzelM

文字を手動でエスケープすると役立つ場合があります。

find . -name "*.exe" | sed -s 's/\ /\\ /' | xargs rm -f
0
Overmind Jiang