Xargs

xargs（エックスアーグズ）は、UNIX 系オペレーティングシステムに用意されているコマンドで、標準入力を読み込み、それを引数として指定したコマンドを実行する。



概要 
xargs は、改行等で区切られた標準入力を読み込み、空白で区切られた１行の文字列へ加工し、それを引数として指定したコマンドへ渡して実行させる。

 % (echo Bravo.txt ; echo Charlie.txt) | xargs -- chmod a-x Alpha.txt

というコマンドは次のものと等価である。

 % chmod a-x Alpha.txt Bravo.txt Charlie.txt

上記の例は echo で生成させたファイルパスを xargs に与えるものだが、find コマンドで階層的に検索して取得したファイルパスを xargs に与えることもできる。

 % find path -type f -name '*.txt' | xargs -- chmod a-x

ただし、find コマンドが出力するファイルパスのリストはとても長くなる場合がある。xargs コマンドが内部的に発生させる chmod コマンドの１行が長すぎることになり、chmod コマンド実行失敗する。

find コマンドが例えば200個のファイルパスを出力した場合、xargs が内部的に生成する chmod コマンドの１行はこんな感じになる。

  % chmod a-x filepath1 filepath2 … filepath200

この場合、xargs が内部的に生成した chmod コマンドを実行することは出来ないかもしれない。

ただし、発生させるコマンドがこの例のように chmod コマンドであれば、内部的に発生させるコマンドの長さを調整する機能を用いることで回避できるだろう。

 % find path -type f -name '*.txt' | xargs -n 3 -- chmod a-x

この例では、xargs は find コマンドが出力した200個のファイルパスを3個ごとに（3個に満たない場合はその個数だけで）chmod を呼び出す。

 % chmod a-x filepath1 filepath2 filepath3
 % chmod a-x filepath4 filepath5 filepath6
                    :
 % chmod a-x filepath199 filepath200

もとのコマンドとは異なりはするが、find が出力したファイルを全部のパーミッションを変更するという目的は果たせる。

ただ、このような方法が使えるかどうかは内部的に発生させるコマンド次第である。chmod でなく、例えば tar コマンドの場合は使えない。

xargs コマンドはしばしばたくさんのシェルのバッククォート機能と同じ機能を持っている。しかし、より柔軟で、入力に空白や特殊文字を含む場合にはしばしばより安全でもある。

脚注

関連項目 
 GNU parallel

外部リンク 
 Manpage of XARGS GNU 版。JM Project
 xargs(1) man page（SunOS リファレンスマニュアル）

UNIXのソフトウェア