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" |
上記のコードでは、xargs
がone 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
なので、スペースを含むファイル名を処理してもエラーは報告されません。
xargs
がfind
コマンドに特に適している理由はもう 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 つのコマンド (echo
と mkdir
) を実行したいとします。-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 コンテナを同時に閉じることを意味します。
参考リンク
- xargs は echo の逆関数です
- Linux および Unix の xargs コマンド チュートリアルと例、George Ornbo
- 初心者向け Linux Xargs コマンドの 8 つの実践例、Himanshu Arora
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0