find
でファイルやディレクトリを検索して、その結果を xargs
に渡してゴニョゴニョするのは便利ですが、区切り文字に気をつけないとうまくいかない場合があります。
条件に一致するファイルをまとめて削除したい
$ ls bar.txt foo.txt hoge hoge.txt piyo.doc
カレントディレクトリにこのようなファイルがあったとして、拡張子が .txt のファイルをまとめて削除したい場合、以下のようにするといいです。
$ find . -name "*.txt" -print0 | xargs -0 rm
-print0 と -0 オプション
$ find . -name "*.txt" -print0 | xargs -0 rm
なにやら find
に -print0
オプション、 xargs
に -0
オプションがついていますが、なぜこの指定が必要なのかというと、 xargs
コマンドが改行や空白、タブ文字を区切り文字として扱うようになっているからなんですね。
xargs
の -0
オプションは区切り文字をNULL文字 ( \0 ) に変更するためのものです。
こうすることで “hoge hoge.txt” のようなファイル名が “hoge” “hoge.txt” のように分解されてしまうのを防げます。
xargs
の認識する区切り文字をNULL文字に変更したので、 find
の出力する区切り文字もNULL文字に合わせてあげる必要があります。よって、 find
オプションに -print0
を指定していたという訳です。