xargs コマンドは、他のコマンドと組み合わせると非常に便利です。
このチュートリアルでは、いくつかの簡単な例を使用して xargs コマンドの使用法を説明します。
これらの例は、xargs コマンドがどのように機能するかの基本を理解するのに役立ちます。しかし、これらの概念を理解すれば、さまざまなコマンド ラインの問題を解決するための xargs の独自の巧妙な例を考え出すことができます。
xargs の構文 (man ページから):
<ブロック引用>xargs [-0prtx] [-E eof-str] [-e[eof-str]] [–eof[=eof-str]] [–null] [-d 区切り文字] [–delimiter 区切り文字] [-I replace- str] [-i[replace-str]] [–replace[=replace-str]] [-l[max-lines]] [-L max-lines] [–max-lines[=max-lines]] [ -n max-args] [–max-args=max-args] [-s max-chars] [–max-chars=max-chars] [-P max-procs] [–max-procs=max-procs] [–interactive] [–verbose] [–exit] [–no-run-if-empty] [–arg-file=file] [–show-limits] [–version] [–help] [command [initial-arguments] ]]
1. Xargs の基本的な例
xargs コマンド (デフォルト) は stdin からの入力を想定し、入力に対して /bin/echo コマンドを実行します。引数なしで xargs を実行した場合、または他のコマンドと組み合わせずに実行した場合は、次のようになります。
引数なしで xargs を入力すると、stdin を介して入力を入力するように求められます:
$ xargs Hi, Welcome to TGS.
何かを入力したら、ctrl+d を押します。以下に示すように、stdout に文字列がエコー バックされます。
$ xargs Hi, Welcome to TGS.Hi, Welcome to TGS.
2. -d オプションを使用して区切り文字を指定
xargs の -d オプションを使用して、入力の各文字が文字どおりに解釈されるように、区切り記号を適用できます。
前の例では、入力には「Hi」の後に \n (改行) が含まれていましたが、エコーされた出力には改行「\n」が含まれていませんでした。そのため、前の例の出力は 1 行にまとめられています。
次の例では、-d\n を使用すると、出力に改行区切り文字が保持され、入力されたとおりに出力が表示されます。
$ xargs -d\n Hi, Welcome to TGS.
上記を入力した後、ctrl+d を押すと、以下に示すように、stdout で文字列がエコーバックされます。ただし、今回は改行を保持します。
$ xargs -d\n Hi, Welcome to TGS.Hi, Welcome to TGS.
3. -n オプションを使用して 1 行あたりの出力を制限する
前に説明したように、デフォルトでは、xargs は以下に示すように stdin に来るものをすべて表示します。
$ echo a b c d e f| xargs a b c d e f
ただし、xargs コマンドの出力は、-n オプションを使用して複数の行に分割できます。
次の例では、-n 3 を使用しています。これにより、xargs 出力で 1 行あたり 3 項目のみが表示されます。
$ echo a b c d e f| xargs -n 3 a b c d e f
同様に、以下に示すように、-n 2 を使用して、出力を 1 行に 2 項目に分割することもできます。
$ echo a b c d e f| xargs -n 2 a b c d e f
4. -p オプションを使用して実行前にユーザーにプロンプトを表示
オプション -p を使用すると、ユーザーから xargs コマンドの実行を確認できます。
前の例を考慮して、ユーザーによる /bin/echo コマンドの各実行を確認したい場合は、以下に示すように -n オプションと共に -p オプションを使用します。
$ echo a b c d e f| xargs -p -n 3 /bin/echo a b c ?...y /bin/echo d e f ?...a b c y d e f
次の出力では、すべてのエコー出力に「n」を付けています。そのため、xargs は何も実行しませんでした。
$ echo a b c d e f| xargs -p -n 3 /bin/echo a b c ?...n /bin/echo d e f ?...n /bin/echo ?...n
注:これは、xargs を rm のような破壊的なコマンドと組み合わせる場合に役立ちます。そのような場合、xargs が何をするかを見たいと思うかもしれません。
5. -r オプションを使用して空白入力のデフォルト /bin/echo を回避
空白の入力がある場合 (つまり、xargs コマンドに何も入力されていない場合)、/bin/echo コマンドが実行され、以下に示すように新しい行が表示されます。
$ xargs -p
「xargs -p」と入力した後に ctrl-d を押すと、以下に示すように /bin/echo が実行されたことを示します。
$ xargs -p /bin/echo ?...y $
6. -t オプションを使用してコマンドを出力とともに出力
次の例では、xargs -t コマンドの入力として「abcd」と入力します。
$ xargs -t abcd
ctrl-d を押して上記の xargs -t コマンドを完了します。これにより、出力を表示する前に xargs が実際に実行するコマンドが表示されます。この場合、xargs が実行するコマンドは「/bin/echo abcd」で、ここに表示されます。
$ xargs -t abcd /bin/echo abcd abcd
7. Xargs を検索コマンドと組み合わせる
xargs コマンドの最も重要な使用方法の 1 つです。特定の種類のファイルを見つけて特定のアクションを実行する必要がある場合 (最も一般的なのは削除アクションです)。
xargs コマンドは、他のコマンドと組み合わせると非常に効果的です。
次の例では、find コマンドの出力を取得し、それを入力として xargs コマンドに渡しました。ただし、デフォルトの /bin/echo コマンドを実行する代わりに、入力に対して rm -rm コマンドを実行するように xargs コマンドに指示しています。
したがって、この例では、find コマンドの出力は拡張子が *.c のすべてのファイルであり、xargs コマンドへの入力として与えられ、すべての *.c ファイルに対して「rm -rf」コマンドを実行します。 .
$ ls one.c one.h two.c two.h $ find . -name "*.c" | xargs rm -rf $ ls one.h two.h
8.ファイル名に空白が含まれるファイルを削除
したがって、このディレクトリ内の .c ファイルに対して rm コマンドを実行しても、ファイル「The Geek Stuff.c」は削除されていないことがわかります。これは、このファイルの名前に空白文字が含まれているためです。
次の例に示すように、拡張子が *.c のファイルを 1 つを除いてすべて削除しました。つまり、ファイル名に空白が含まれるファイル (つまり、「The Geek Stuff.c」) は、rm コマンドによって削除されませんでした。
$ touch "The Geek Stuff.c" $ ls one.c one.h two.c two.h The Geek Stuff.c $ find . -name "*.c" | xargs rm -rf $ ls one.h two.h The Geek Stuff.c
このような場合は、find コマンドで -print0 オプションを使用し、xargs コマンドで -0 オプションを使用して、以下に示すように、ファイル名にスペースを含むファイルを削除します。
$ ls one.c one.h two.c two.h The Geek Stuff.c $ find . -name "*.c" -print0 | xargs -0 rm -rf $ ls one.h two.h
9. –show-limits オプションを使用して xargs のシステム制限を表示
以下の例を参照してください:
次の例は、xargs コマンドの動作に影響を与える、OS によって設定されたすべての制限を示しています。
$ xargs --show-limits Your environment variables take up 1203 bytes POSIX upper limit on argument length (this system): 2093901 POSIX smallest allowable upper limit on argument length (all systems): 4096 Maximum length of command we could actually use: 2092698 Size of command buffer we are actually using: 131072 Execution of xargs will continue now, and it will try to read its input and run commands; if this is not what you wanted to happen, please type the end-of-file keystroke. Warning: /bin/echo will be run at least once. If you do not want that to happen, then press the interrupt keystroke
10. Xargs を Grep コマンドと組み合わせる
xargs コマンドを grep コマンドと組み合わせて、find コマンドの検索結果から特定のファイルをフィルタリングできます。
次の例では、find コマンドはすべての .c ファイルを xargs への入力として提供しています。
xargs コマンドは、grep コマンドを実行して、文字列「stdlib.h」を含むすべてのファイル (find コマンドによって提供されるファイルの中から) を検索します。
$ find . -name '*.c' | xargs grep 'stdlib.h' ./tgsthreads.c:#include ./valgrind.c:#include ./direntry.c:#include ./xvirus.c:#include ./temp.c:#include ... ... ...