本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、標準入力やファイルからリストを読み込んでコマンドラインを作成し、実行する「xargs」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、標準入力やファイルからリストを読み込んでコマンドラインを作成し、実行する「xargs」コマンドです。
「xargs」は、「標準入力やファイルからリストを読み込み、コマンドラインを作成して実行する」というコマンドです。
例えばあるコマンドの出力をパイプでxargsコマンドに送り込み、別のコマンドの引数として指定するといった使い方ができます。
xargs [オプション] コマンド [コマンドの引数]
※[ ]は省略可能な引数を示しています。
短いオプション | 長いオプション | 意味 |
---|---|---|
-a ファイル | --arg-file=ファイル | 標準入力の代わりにファイルから項目を読み込む |
-0 | --null | 入力を空白や改行ではなくNULL文字で区切る |
-d 文字 | --delimiter=文字 | 入力の区切り文字を指定する。\000(8進数)または\x00(16進数)も使用可能 |
-E 終端文字列 | ファイルの終端文字列を指定する ※1 | |
-I 置換文字列 | xargs実行時に指定したコマンドの引数のうち、置換文字部分を標準入力から読み込んだ名前で置き換える(「-L 1」相当の動作になる。本文参照) ※1 | |
短いオプション | 長いオプション | 意味 |
---|---|---|
-L 行数 | 1回のコマンドラインで使用する入力行数の上限(指定した行数ごとにコマンドを実行することになる。本文参照) ※1 | |
-n 個数 | --max-args=個数 | 1回のコマンドラインで使用する引数の上限 |
-s 文字数 | --max-chars=文字数 | 1回分のコマンドラインの最大文字数 |
-x | --exit | 作成されたコマンドラインの長さが上限を超過していたら終了する(-I、-L使用時は自動で有効になる) |
--show-limits | コマンドラインの長さの上限を表示する(表示して直ちに終了したい場合は「xargs --show-limits -r < /dev/null」のように実行) | |
-P プロセス数 | --max-procs=プロセス数 | 同時に実行するプロセス数の上限を指定する(0を指定すると無制限になる。デフォルトは1) |
-r | --no-run-if-empty | 標準入力が空の場合は指定したコマンドを実行しない(「-r」を指定しなかった場合、入力が空でもコマンドを1回は実行する) |
-t | --verbose | 実行前にコマンドラインを標準エラー出力へ出力する |
-p [文字列] | --interactive[=文字列] | 実行前に文字列とコマンドラインをプロンプトとして表示してユーザーの入力を待つ。文字列を指定しなかった場合はコマンドラインのみをプロンプトとして表示する。なお、いずれの場合も自動的に-tを指定したことになる |
※1 これらのオプションにはほぼ同じ機能を指定する別のオプションがあるものの非推奨となっている。「-E」に対して「-e」と「--eof」、「-I」に対して「-i」と「--replace」、「-L」に対して「-l」と「--max-lines」である。動作の違いはmanコマンドの説明を参照(man xargs)。
「コマンドA | xargs コマンドB」で、コマンドAの実行結果を引数にしてコマンドBを実行します。
画面1では、grepコマンド(連載第9回)を用いて、/etcの直下にあるファイルのうち、「bash」という文字列を含むファイルの一覧を得て(「-l」オプション)います。それをheadコマンド(第3回)に受け渡して、3行ずつ表示しています。
grepコマンドによってリストアップされたファイル(画面2)が、xargsコマンドによって「head -3 ファイル1 ファイル2 ファイル3……」のように実行されています。
なお、/etcを対象にgrepを実行すると、許可のないファイルなどでエラーメッセージを表示します。そこで、grepコマンドの出力に「2>/dev/null」を指定しています。
コマンドA | xargs コマンドB
(コマンドAの実行結果を引数にしてコマンドBを実行)
grep -l bash /etc/* 2>/dev/null | xargs head -3(画面1)
(grepコマンドの実行結果を引数にして、headコマンドを実行)
「-p」オプションで、xargsコマンドが作成したコマンドラインを確認できます(画面3)。
「-p」は実行前にプロンプトを表示し、「y」または「Y」をユーザーが入力したら実行する、というオプションです ※2。コマンドラインは確認したいものの、一時停止はしなくてよい場合は、「-p」ではなく「-t」オプションを使用するとよいでしょう。
※2 「y」または「Y」以外を入力したときはコマンドラインを実行しない。
コマンドA | xargs -p コマンドB
(ユーザーの入力を待ってから実行する)
grep -l bash /etc/* 2>/dev/null | xargs -p head -3
(headコマンドの実行内容をユーザーが確認してから実行する)(画面3)
「コマンドA | xargs コマンドB」と実行したとき、コマンドAの出力結果が多い場合は、何回かに分けてコマンドBを実行します。1回に指定できる引数の個数や、1回で実行できるコマンドラインの長さは、実行するコマンドや環境によって異なります。
xargsに「-L」オプションを指定すると、コマンドAの出力結果に対し、コマンドBを1つ1つ個別に実行できます。例えば「xargs -L 1」のように指定します。
画面4では、画面3の処理に「-L 1」を追加しました。grepの結果1行ごとに、確認メッセージを表示しながらheadコマンドを実行しています。1行目(/etc/auto.net)に対しては「y」で実行し、2行目(/etc/auto.smb)に対しては「n」でスキップしました ※3。
※3 途中の行で「n」を入力したとしても、全ての結果について実行するかどうか確認メッセージを表示する。
コマンドA | xargs -L 1 コマンドB
(コマンドAの出力1行ごとにコマンドBを実行する)
grep -l bash /etc/* 2>/dev/null | xargs -L 1 -p head -3
(headコマンドの実行内容をユーザーが1行ずつ確認してから実行する)
xargsコマンドを利用した場合、引数の指定位置に困ることがあります。例えば「コマンドA | xargs コマンドB 引数B」のように、コマンドBに対して引数Bを指定した場合、コマンドラインは「コマンドB 引数B ファイル1 ファイル2 ファイル3……」となってしまいます。「コマンドB 引数B」の後ろに、コマンドAの実行結果がさらに引数として付いた形です。
引数の位置を変更したい場合は「-I」オプションを使います。「-I 置換文字列」のように指定し、例えば、「コマンドA | xargs -I {} コマンドB 引数1 {} 引数2」のようにすると、コマンドBの「{}」(置換文字列)の位置にコマンドAの実行結果が1つずつ入ります。なお、-Iオプションを指定すると、自動的に「-L 1」を指定したことになります。
画面5と画面6では、実行内容を確認しやすくするために、echoコマンドを使用しました。
grep -l bash /etc/* 2>/dev/null | xargs -I {} echo "[" {} "]"
({}の位置にファイル名が入る)(画面5)
grep -l bash /etc/* 2>/dev/null | xargs -L 1 echo "file:"
(echoコマンドの最後にファイル名が入る)(画面6)
西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.