web-dev-qa-db-ja.com

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

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

$ rm "file name"

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

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

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

26
Ashley

findxargsに両方ともヌルターミネータを使用するように指示できます。

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

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

find . -name "*.txt" -delete

または(@kosに感謝)

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

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

48
steeldriver

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

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

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

1
Ibrahim

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

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

SOのソース回答

0
joseph_morris