Ola Kae Tode Tai

すべてのエンジニアに、追い風を祈る。

findとxargsを使うときのfind -print0とxargs -0

f:id:kironono:20141127022946j:plain

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 を指定していたという訳です。

このようにすることで “hoge hoge.txt” のように空白を含むファイル名もうまく扱ってくれます。