読者です 読者をやめる 読者になる 読者になる

locate などの出力に対して xargs -0 を使う

cmd

Linux系のよく使うパターンに以下のようなものがある。要するに find で引っ掛けたファイルに対して grep をかけるというもの。

$ find ./hogehoge -type f -print0 | xargs -0 grep "foobar"

普通にパイプで渡すとファイル名に空白文字などが含まれていると上手く grep でひかっけられない。ので、-print0 と -0 を重ねることでファイル名の区切りを空白文字からヌル文字(\0)に置き換えている。

普通に find を使う分には -print0 のオプションが使えるので便利なんだけど、既にファイルの一覧ができてしまっている場合や locate でファイルを引っ掛けた場合に使えなくてゲンナリする。で、その対応。

とは言っても別に特別なことをするわけじゃなく、tr コマンドで改行をヌル文字(\0)に変えればいいんじゃないのってだけの話。

$ find ./hogehoge -type f > sample.lst
$ cat sample.lst | tr "\n" "\0" | xargs -0 grep "foobar"

locateから直接パイプで流し込むなら以下の様な感じ

$ locate "/hogehoge" | tr "\n" "\0" | xargs -0 grep "foobar"