find -nameをxargsにパイプすると、ファイル名にスペースがコマンドに渡されなくなります


26

通常、ファイル名にスペースが含まれるファイルを削除するには、次を実行する必要があります。

$ rm "file name"

しかし、複数のファイルを削除したい場合、例えば:

$ find . -name "*.txt" | xargs rm

これにより、スペースが含まれるファイルは削除されません。


ここで完全な推測:find -name "*\ *.txt" | xargs rm2つの単語ファイルで動作しますか?
TheWanderer

回答:


49

あなたは言うことができるfindxargsの両方の使用のヌルターミネータへ

find . -name "*.txt" -print0 | xargs -0 rm

または(簡単)の組み込み-deleteアクションを使用するfind

find . -name "*.txt" -delete

または(@kosに感謝)

find . -name "*.txt" -exec rm {} +

どちらもをARG_MAX必要とせずにシステムの制限を尊重する必要がありxargsます。


1
あなたが言及したので、二度の厳しい:)それをupvoteすることはできませんARG_MAX、私もそれが言及よfind . -name "*.txt" -exec rm {} \;「安全ショット」だろう
コス

3
したがって、マスターと言う:常にxargs -0を覚えておいてください。
ジョシュア

1
非常に重要なポイント:-print0最後のオプション(または少なくとも-name "*.txt")でなければ、これに限定されない*.txtファイルにヒットします...
Kev

1

ちなみに、find以外のものを使用した場合は、trを使用して改行をヌルバイトに置き換えることができます。

例えば。次の1つのライナーは、名前にスペースが含まれている場合でも、ディレクトリ内の最後に変更された10個のファイルを削除します。

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm


はい、これは動作します。
ピーターモーテンセン

0

xargsコマンドは、デフォルトで区切り文字としてタブ、スペース、および改行を使用します。-dオプションを使用すると、改行文字( '\ n')のみを使用するように指示できます。

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

SOに関するソースの回答


その答えは、BSDシステムの(for )の-0代わりに言及しています。Ubuntuは何を使用しますか?ここで受け入れられている答えはを使用しています。何が正しいのですか?-dxargs-0
ピーターモーテンセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.