質問: 表題のとおりです。 findの出力結果をgrepに渡して該当行を出力しようとした際に、 下記の条件で、 --- ■カレントディレクトリ Desktop ■ファイル ./fileA ./dirA/fileA ■fileAの内容 abc def ghi --- find . -name fileA | xargs grep abc を実行すると ./dirA/fileA:abc ./fileA:abc が出力されますが、 find . -name fileA | grep abc を実行すると 何も出力されません。 自分の理解ではxargsコマンドもパイプも標準出力結果を次のコマンドの引数に渡すという認識なのですが、 どういった違いがあるのでしょうか。 ご教示いただけると大変幸いです。
回答: `xargs`は、「標準入力に来たファイル名を、コマンドライン引数に変換して引数のプログラムに渡す」というプログラムです。`xargs`を入れていない後者の場合、`grep`の引数にファイルがないので、入力は標準入力の内容、つまり**ファイル名リストそのもの**ということになってしまって、指定ファイルの中からは検索されません。 なお、このままfind+xargsを使うと、空白などの特殊文字が入った場合にうまく動かなくなります。GNU版の`find`や`xargs`の場合には、 ``` find . -name fileA -print0 | xargs -0 grep abc ``` とすることで、ファイル名に絶対ならない**ヌル文字**を区切り文字にして、どんなファイル名でも正常動作できるようになります。