xargs コマンド

導入

xargs は、標準入力 (stdin) を後続のコマンドの文字列パラメータに変換するために使用されます。通常、パイプコマンド (|) と組み合わせて使用​​されます。

$ {{command1}} | xargs {{command2}}

以上がxargsの使い方です。通常の状況では、最初のコマンド command1 は結果をコンソール (つまり、標準出力 stdout) に出力しますが、パイプ コマンド (|) は command1 の標準出力をインターセプトして変換します。標準入力 (stdin)、つまり xargs コマンドは標準入力を受け取り、それを command2 の文字列パラメータに変換して実行します。

たとえば、テキスト ファイルlist.txtの内容はファイル名のセットです。

a.txt
b.txt
c.txt

次に、次のコマンドを実行して、この一連のファイルをすべて削除します。

# a.txt b.txt c.txt を削除
$ cat list.txt | xargs rm

上の例では、catコマンドはlist.txtの内容を標準出力に出力しますが、パイプラインコマンドによってインターセプトされ、xargsの標準入力に変換されます。 rm コマンドの文字列パラメータ。つまり、次のコマンドが実際に実行されます。

$ rm a.txt b.txt c.txt

一般に、Linux コマンドは 2 つのタイプに分類され、1 つは標準入力 (通常はキーボード) をパラメータとして受け入れ、もう 1 つはコマンド ライン文字列をパラメータとして受け入れます。これら 2 つのパラメータのプロパティは大きく異なります。標準入力 (stdin) はテキスト ストリーム (ストリーム) であり、終端されない限り理論的には無限です。コマンド ライン パラメータは固定長のテキスト配列です。 xargs の機能は、標準入力を受け入れ、それをコマンド ライン パラメーターに変換することです。

xargs は、echo コマンドの逆のようなものです。 echo コマンドは、コマンド ライン パラメーターを標準出力に変換します。

$ echo abc

上記のコマンドでは、abcはコマンドラインパラメータであり、echoコマンドはそれを標準入力に変換します。

パイプコマンド | は、前のコマンドの標準出力を次のコマンドの標準入力に変換します。ただし、ほとんどのコマンドはコマンド ライン引数のみを受け入れるため、パイプ コマンドは、Linux で一般的な操作である xargs と組み合わせて使用​​する必要があります。

xargs のスタンドアロンでの使用

xargs コマンドは単独で使用することもできます。これは xargs echo を実行するのと同じです。

$xargs
# イコール
$ xargs echo

xargsと入力して Enter キーを押すと、コマンド ラインは標準入力 (つまり、ユーザーのキーボード入力) を待ちます。任意の内容を入力し、Ctrl+d を押して入力の終了を示すことができます。この時点で、echoコマンドは前の入力を出力します。

$ xargs
hello (Ctrl + d)
hello

上の例では、xargsを実行した後、キーボードからhelloと入力してCtrl+dを押すと、echo helloが自動的に実行されます。

別の例を見てみましょう。

$ xargs find -name
"*.txt"
./foo.txt
./hello.txt

上の例では、xargs find -nameと入力した後、コマンドラインはユーザーが検索するファイルを入力するのを待ちます。ユーザーは、現在のディレクトリ内のすべての TXT ファイルを検索することを意味する*.txtを入力し、Ctrl+d を押します。これは、入力が完了することを意味します。この時点で、find -nameを実行するのと同じになります。 *.txt`。

-d パラメータと区切り文字

デフォルトでは、xargsは標準入力を個々のコマンドライン引数に分割するための区切り文字として改行とスペースを使用します。

$ echo "1 2 3" |

上記のコードでは、xargsone two threeを 3 つのコマンドラインパラメータに分解し、mkdir one two threeを実行するため、mkdirは 3 つの新しいサブディレクトリを作成します。

-d パラメータは区切り文字を変更できます。

$ echo -e "a\tb\tc" | xargs -d "\t" echo
a b c

上記のコマンドでは、区切り文字としてタブ文字\tを指定しているため、a\tb\tcは 3 つのコマンド ライン パラメータに変換されます。 echoコマンドの-eパラメータは、エスケープ文字を解釈することを意味します。

-p パラメータ、-t パラメータ

xargs コマンドを使用した後、パラメータの変換処理により、どのコマンドが実行されたかを確認する必要がある場合があります。

-p パラメータは、実行するコマンドを出力し、それを実行するかどうかをユーザーに尋ねます。

$ echo 'one two three' | xargs -p touch
touch one two three ?...

上記のコマンドを実行すると、実行する最終コマンドが表示され、ユーザーが確認できるようになります。ユーザーが Enter キーを押すまで、実際には実行されません。

-t パラメータは、実行される最終コマンドを出力し、ユーザーの確認なしで直接実行します。

$ echo 'one two three' | xargs -t rm
rm one two three

-0 パラメータと find コマンド

xargs はデフォルトで区切り文字としてスペースを使用するため、スペースを含む可能性のあるファイル名の処理にはあまり適していません。

find コマンドには特別なパラメータ -print0 があり、出力ファイルのリストが null で区切られることを指定します。したがって、xargsコマンドの-0パラメータは、区切り文字としてnullを使用することを意味します。

$ find /path -type f -print0 | xargs -0 rm

上記のコマンドは、/pathパスの下にあるすべてのファイルを削除します。区切り文字はnullなので、スペースを含むファイル名を処理してもエラーは報告されません。

xargsfindコマンドに特に適している理由はもう 1 つあります。一部のコマンド (rm など) は、パラメーターが多すぎて実行できない場合、パラメーター リストが長すぎますというエラーを報告します。代わりに xargs を使用すると、パラメーターごとにコマンドが 1 回実行されるため、この問題は発生しません。 。

$ find . -name "*.txt" | xargs grep "abc"

上記のコマンドですべての TXT ファイルが見つかったら、各ファイルを 1 回検索して、文字列abcが含まれているかどうかを確認します。

-L パラメータ

標準入力に複数の行が含まれている場合、-Lパラメータはコマンドライン引数として使用する行数を指定します。

$ xargs find -name
"*.txt"
"*.md"
find: paths must precede expression: `*.md'

上記のコマンドは、"*.txt"*.md の 2 行をコマンド ライン パラメーターとして同時に使用し、それらを find コマンドに渡しているため、エラーが発生します。

-L パラメータを使用して各行をコマンド ライン パラメータとして指定すると、エラーは報告されません。

$ xargs -L 1 find -name
"*.txt"
./foo.txt
./hello.txt
"*.md"
./README.md

上記のコマンドは、各行 (-L 1) をコマンド ライン パラメーターとして指定し、コマンド (find -name) を 1 回実行します。

別の例を示します。

$ echo -e "a\nb\nc" | xargs -L 1 echo
a
b
c

上記のコードでは、echo コマンドが 1 行ごとに 1 回実行されるように指定されているため、echo コマンドは 3 回実行され、3 行が出力されます。

-n パラメータ

-L パラメータは複数行の問題を解決しますが、場合によってはユーザーが同じ行に複数の項目を入力することがあります。

$ xargs find -name
"*.txt" "*.md"
find: paths must precede expression: `*.md'

上記のコマンドでは、コマンド ライン パラメーターとして同じ行に 2 つの項目が使用されているため、エラーが発生します。

-n パラメータは、毎回コマンド ライン パラメータとして使用する項目の数を指定します。

$ xargs -n 1 find -name

上記のコマンドは、標準入力の各項目 (-n 1) がコマンド ライン パラメーターとして使用され、コマンド (find -name) が 1 回実行されることを指定しています。

別の例を示します。

$ echo {0..9} |
0 1
23
4 5
6 7
8 9

上記のコマンドは、echoコマンドが 2 つのパラメーターごとに 1 回実行されることを指定しています。したがって、echoコマンドは 10 個のアラビア数字に対して 5 回実行され、5 行が出力されます。

-I パラメータ

xargs がコマンドライン引数を複数のコマンドに渡したい場合は、-I パラメータを使用できます。

-I は、各コマンドライン引数の代替文字列を指定します。

$ 猫 foo.txt
1つ
二
三つ

$ cat foo.txt | xargs -I ファイル sh -c 'mkdir ファイル'
1つ
二
三つ

$ls
1 2 3

上記のコードでは、foo.txtは 3 行のテキスト ファイルです。各コマンドラインパラメータに対して 2 つのコマンド (echomkdir) を実行したいとします。-I file を使用して、file がコマンドラインパラメータの置換文字列であることを示します。コマンドを実行すると、echo file内の 2 つのfileが特定のパラメータに置き換えられます。

--max-procs パラメータ

デフォルトでは、xargsはコマンドの実行に 1 つのプロセスのみを使用します。コマンドを複数回実行する場合は、前の実行が完了するまで待ってから次のコマンドを実行する必要があります。

--max-procs パラメータは、コマンドを同時に並列実行するために使用するプロセスの数を指定します。 --max-procs 2は同時に最大 2 つのプロセスを使用することを意味し、--max-procs 0はプロセスの数を制限しないことを意味します。

$ docker ps -q -n 1 --max-procs 0 docker kill |

上記のコマンドは、実行速度が大幅に速くなるように、できるだけ多くの Docker コンテナを同時に閉じることを意味します。

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0