xargsとgrepとパイプ
xargsがどんなコマンドで何をしているのかを簡単に解説。
普段CUIを使用していないとしても、パイプを使用して何らかの出力結果をgrepに渡した経験のある方は多いと思う。そのときxargsの引数としてgrepを実行することが多々あります。ぶっちゃけ個人的にはxargsはfindの結果をgrepに渡すときに使用するコマンドといっても過言ではない。そのときxargsは何をしているのだろうか。
xargsとは
man pageによると
xargs - 標準入力を読み込んでコマンドラインを作成し、それを実行する
Man page of XARGS
ナンノコッチャわかりませんね。
ポイントなのは"標準入力を読み込んでコマンドラインを作成"の部分(ほぼ全部)。
findのときだけgrepにxargsをつける理由
findの結果は標準出力に出力さるが、パイプ'|'でつなぐことでfindの出力を後ろのコマンドの入力として使用できる。例えばfindの結果、HelloWorld.javaとGreeting.javaが見つかったとする。
$ find . -name "*.java" HelloWorld.java Greeting.java
これをxargsなしのパイプで渡すと次のコマンドには「HelloWorld.java」と「Greeting.java」という出力そのものがgrepへの入力として渡される。
$ find . -name "*.java" | grep Hello HelloWorld.java
それに対してパイプを使用してxargsに渡すとxargsは「(パイプで渡された)標準入力を読み込んで、(入力を引数とする)コマンドラインを作成」してくれる。
# Greeting.javaにgreet()メソッドがあるとして $find . -name "*.java" | xargs grep greet public String greet() {
まとめ
xargsはパイプで渡された標準入力を、xargsの引数に与えられるコマンドの引数として使用する。
これでfindとgrepの組み合わせ以外にも使用することができますね。