あるべるのIT関連メモ

素人エンジニアが何かするときに困ったものなどを参考程度にメモっておこうかと

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の組み合わせ以外にも使用することができますね。