xargs - 標準入力と引数を組み合わせコマンドを実行する

スポンサーリンク

xargsはEX-argsと読み、引数を組み合わせるという意味を持ちます。xargsコマンドは標準入力からリストファイルを読み込み、引数のコマンドラインにそのリストファイルのアイテムを渡して、実行することができます。

スポンサーリンク

xargsの使い方

xargsコマンドは、標準入力からコマンドの引数にしたいアイテムのリストを、xargsコマンドの引数には実行したいコマンドを入力して、実行します。アイテムのリストは、例えば、findコマンドが利用できます。

xargsコマンドは引数にした実行したいコマンドの末尾に、標準入力から読み込んだアイテムを挿入して、実行したいコマンドを実行していきます。追記するアイテムはオプションで指定しない限り、コマンドラインで制限されている文字数まで一行のコマンドとして挿入されます。

 

また、どのようなコマンドが実行されているかは-tオプションで確認することが出来ます。
xargsコマンドで引数にするコマンドがない場合は、デフォルトとしてechoコマンドが実行されます。

 

xargsコマンドで標準入力からのアイテムをひとつずつコマンド実行するには-nオプションを利用します。

 

 

 

xargsの利用例

標準入力からコマンドにアイテムを挿入し実行
(オプションなし)

xargコマンドは、標準入力からファイルリストなどのリストファイルからアイテムを読み取り、xargsコマンドの引数になっているコマンドの末尾にアイテムを挿入して、実行します。ファイルリストは空白や改行で区切られている必要があります。

コマンド例はカレントディレクトリから下のディレクトリにあるすべてのテキストファイルを結合しています。

コマンド例

ディレクトリの内容

ファイルの内容

実行結果

 

ファイル内容の順番が気になる場合はファイルリストをソートしてみても良いかもしれません。
コマンド例と実行結果
find - ファイルを検索しファイルリストを出力する
findコマンドはファイルを検索して検索したファイルリストを出力するコマンドです。 追加で式(expression)を記述することで、検索するファイルを絞り込むことができます。 また、-exec等の式を用いることで検索したファイルを用いてコ...

 

 

 

挿入するアイテムの数を指定
(-nオプション)

-nオプションを用いることで、挿入するアイテムの数を指定することができます。空白が含まれるアイテムは、アイテムや空白を' 'や" "で囲んだり、'\ 'のようにバックスラッシュでエスケープして一つのアイテムにできます

コマンド例(1の場合)

itemlist.txt

実行結果

 

コマンド例(2の場合)

実行結果

 

 

 

読み取る行数を指定
(-Lオプション)

-Lオプションは、標準入力から最大何行読み取るかどうか指定することができます。-nオプションとは違い、行をアイテムとしてコマンドに挿入することができます。

コマンド例(1の場合)

itemlist.txt

実行結果

 

コマンド例(2の場合)

実行結果

 

 

 

アイテムをコマンド末尾以外に挿入
(-Iオプション)

-Iオプションは、文字列を指定して、xargs内のその文字列をアイテムに置き換えることが出来ます。この文字列の置き換えにより、標準入力から来るアイテムをコマンド末尾以外でも使用することが出来ます。また、使用する文字列はfindコマンドの-execの式を参考に'{}'を指定することが多いでしょう。

また、-Iオプションは、標準入力からの入力行を1行読み取り、コマンドラインの最大文字数制限を超えたら終了します。これは-L1オプションと-xオプションを意味しています。

コマンド例

itemlist.txt

実行結果

 

非推奨のオプションとして、-iオプションがあります。
これは、-Iと似たオプションになります。-iオプションで文字列を指定しない場合は、-I{}と同じ機能になります。

 

 

 

スペースが含まれるファイル名を扱う
(-0,--nullオプション)

-0オプションまたは--nullオプションは、標準入力からアイテムの区切り文字をヌル文字にすることができます。これは、findコマンドの-print0の式と合わせて使うことができ、スペースが含まれているファイル名を扱うことができます。

コマンド例と実行結果

 

 

 

アイテムの区切り文字を変更
(-dオプション)

-dオプションは、標準入力のアイテムリストの区切り文字を変更することができます。子の区切り文字にはC言語のprintfで使う'\n'のような文字を利用することができます。

コマンド例

itemlist.txt

実行結果

 

 

 

EOF文字列の設定
(-Eオプション)

-Eオプションはファイルの終わりを示す文字列を設定することができます。標準入力で指定した文字列が読み込まれた場合、その文字列以降の入力はすべて無視されます。

コマンド例

eof-testfile.txt

実行結果

 

 

 

標準入力の代わりにファイルを指定
(-aオプション)

-aオプションは、xargsコマンドで標準入力を指定する代わりにファイルを指定することができます。

コマンド例

itemlist.txt

実行結果

 

 

 

実行したコマンドを表示
(-tオプション)

-tオプションは、xargsコマンドで実行したコマンドを標準エラー出力に出力して表示することができます。

コマンド例と実行結果

 

 

 

空の入力を実行しない
(-rオプション)

xargsコマンドはどんな入力でも必ず一回はコマンドを実行します。

 

-rオプションを入れることで空の入力時はコマンドを実行しないようにできます。

 

 

 

コマンドを実行するかどうか問う
(-pオプション)

-pオプションを用いると、コマンドを実行するときに、実行するかどうかをプロンプトで問い、'y'か'Y'で始まる入力をすると、コマンドが実行されます。

コマンド例と実行結果

 

 

 

並列実行
(-Pオプション)

-Pオプションを用いると、指定した数でコマンドを並列実行することができます。コマンドの並列実行を行うと処理をより高速に行うができます。
-Pオプションで0を指定すると利用できるプロセッサの最大数で実行します。

利用できるプロセッサの数は例えば、nprocコマンドで確認することができます。

4と表示されたので、4つのプロセッサが利用できることが確認できました。コマンド例では、4つのプロセッサでコマンドを実行します。

コマンド例と実行結果(並列実行した場合)

 

コマンド例と実行結果(並列実行をしなかった場合)

 

処理速度を向上できたかどうかを簡単な時間測定で処理時間を確認してみます。上の例は同じファイルの圧縮時間を計測したものになります。上の例で並列実行した場合の処理時間は約26秒で、並列実行をしなかった場合の処理時間は約132秒になりました。
132÷26=5.0769...で、並列実行をした結果、並列実行をしなかった場合と比べて約5倍の処理速度の向上ができました。
コマンドによっては並列実行を行うことで処理時間を高速化できる場合があるので、試してみても良いかもしれません。

nproc - プロセッサの数を表示する
nprocコマンドは、現在の利用できるプロセッサの数を表示することができます。

 

 

 

xargsとshの組み合わせ

xargsコマンドでは、シェルの組み込みコマンド等を利用できません。たとえば、宣言された変数を確認するbashの組み込みコマンドdeclareを利用すると

declareというファイルやディレクトリはありませんとエラーメッセージが表示されます。

シェルの機能を用いるため、shコマンドやbashコマンド等の-cオプションを利用することができます。

パイプを利用

xargsコマンドで実行するコマンドにパイプの機能を用いたい場合は、shコマンド等を通して実行することで利用することができます。

 

 

 

viのようなプログラムを利用

viのようなプログラムを利用する場合は標準入力が/dev/ttyでなければなりません。
xargsで実行するコマンドが-oオプションが実装されているxargsコマンドの場合は

で起動することができます。

-oオプションが実装されていない場合は、shコマンドを通して、

のように実行することができます。

 

$@は$1,$2,$3,...のような位置パラメータをすべて展開する変数になります。

間違えて、viのようなコマンドをxargsでそのまま実行して、端末がおかしくなった場合は、

で端末を修正できます。

 

 

 

参考

Finding Files