Macでfindとxargsをパイプで繋いで使うなら -print0 と -0 を必ず使うメモ

find . -type d -print0 | xargs -0 chmod go+rx

ディレクトリ名に0x20(空白)が入るMac OS X環境でfindに-print0を使わずにxargsで受け取るのはヤバい。かなり危険。一度AppleiTunesのアップデートスクリプトで0x20デリミタの想定外動作をやらかして、誤消去したことがあったよなぁ。
なので「findには必ず-print0オプションを付けて、xargs -0で受け取る」というのを広く世に広めたい。

void GraphicWizardsLair( void ); // いまどきfindとxargsを使う時は-print0と-0を忘れずに

この通りすぎて他に書く事があまりありませんが、自分用のメモという事で。


findの-print0は、区切り文字を0x00(ヌル)*1で出力します。
xargsの-0は、通常は空白の所をヌル文字を区切り文字として受けるようにします。

-print0は一番最後に書く

これも引用元に書いてありましたが、-print0は一番最後に書かないと、意図した動きをしないようです。

  • type や -name など条件を書いてから、最後に-print0を書くのがいいようです。

xargsは賢い

何となく使ってるxargsですが、xargs無しでは引数が長過ぎるような場合でも、xargsを使う事で適当に引数を分割してくれるようです。

*1:/0とも表現する