findの-print0
とxargsの-0
。
findとxargsのサンプルを調べていると初めは誰もが疑問に思う謎のオプション。
例えばこんなコマンド。
$ find . -name '*.bak' -print0 | xargs -0 rm
find print0
でググると、トップにでてきたのは下のサイト。
UNIX findとxargsコマンドで-print0オプションを使う理由
よくまとまっていてわかりやすいのですが、下記の部分に誤りがあります。
lsコマンドの結果からわかるように、スペースが含まれるファイル名は、別々なものとして認識されています。
この問題は、findコマンドが区切り文字としてスペースを使っているからです。
findコマンドが区切り文字としてスペースを使っているのではなく、正しくはxargsが区切り文字として空白文字(改行、スペース、タブなど)を使っているからです。
つまり、下のサンプルが示すように、空白と改行の両方を区切り文字として扱ってしまうわけです。
$ echo -e "Hello World\nHelloWorld" | xargs -n1 echo
Hello
World
HelloWorld
処理の前後関係としては、xargsが空白文字でなくヌル文字を区切りとして扱うように-0
を指定し、xargsの形式に合わせるためにfindの-print0
を指定する、という順番で考えた方がシックリくるのではないでしょうか。
参考サイト