Provided by: manpages-ja_0.5.0.0.20221215+dfsg-1_all bug

名前

       xargs - 標準入力を読み込んでコマンドラインを作成し実行する

書式

       xargs [options] [command [initial-arguments]]

説明

       このマニュアルページは GNU 版 xargs の使用法を説明しています。 xargs は、 標準入力から空白
       や改行で区切られた一連の項目を読み込み (空白はダブルクォート、 シングルクォート、 バックス
       ラッシュによって保護できます)、  これを引数にして、  指定した  command を 1 回以上実行する
       (デフォルトのコマンドは echo です)。 このとき、  ユーザーが  command  に対して指定した引数
       (上記書式の  initial-arguments) があれば、 標準入力から読み込んだ一連の項目は、 その後ろに
       追加されます。 標準入力における空行は無視されます。

       command のコマンドラインは、 (-n-L オプションが使用されていない場合は)  システムが定め
       ているコマンドラインの長さの限界に達するまで、  長いものが作成されます。 そして、 指定され
       た  command  が、  入力項目のリストを一つ残らず処理するのに必要な回数だけ、   呼び出されま
       す。そのため、おおむね、  command が呼び出される回数は、入力項目の数よりも、ずっと少なくて
       すむことになります。  このことは、たいていの場合、パフォーマンスを著しく向上させることにな
       ります。 なお、コマンドの中には、都合がよいことに、並列的に実行できるものもあります。-P オ
       プションを参照してください。

       Unix では、 ファイル名に空白や改行を含むことが可能なので、 こうしたデフォルトの動作は、 し
       ばしば問題となります。 空白や改行を含むファイル名は、 xargs によって適切に処理されません。
       このような状況では、  -0  オプションの利用をお勧めします。  これを用いれば問題を回避できま
       す。  なお、 -0 オプションを使う場合は、 xargs の入力を生成するプログラム側でも、 区切り文
       字にヌル文字を使うようにする必要があります。 たとえば GNU find を使う場合ば、 -print0 オプ
       ションを用いることになります。

       指定したコマンドの実行が、  終了ステータス 255 で終了すると、  xargs は即座に停止して、 そ
       れ以上入力を読み込みません。 このときには、 エラーメッセージを標準エラーに出力します。

オプション

       -0, --null
              入力される項目が、 ホワイトスペース (空白や改行) ではなく、  ヌル文字によって区切ら
              れます。  また、 クォートやバックスラッシュは、 特別な扱いをしません (つまり、 すべ
              ての文字がそのままに解釈されます)。 ファイル終端文字列は無効になり、 他の引数と同じ
              ように扱われます。 このオプションは、 入力される項目にホワイトスペース、 クォート、
              バックスラッシュなどが含まれる可能性がある場合に、  役に立ちます。  GNU   find-print0 オプションは、 このモードに適した入力を生成します。

       -a file, --arg-file=file
              入力項目を、  標準入力からではなく  file から読み込みます。 デフォルトでは、 指定し
              たコマンドが実行される際に、 標準入力が /dev/null  に付け換えられますが、  このオプ
              ションを使用した場合は、 標準入力の付け換えが起こりません。

       --delimiter=delim, -d delim
              入力される一連の項目が、  指定された文字によって区切られることになります。 指定され
              る区切り文字は、 単一の文字でもよく、 \n のような C 言語式のエスケープ文字でも、  8
              進数や 16 進数のエスケープコードでもかまいません。 8 進数や 16 進数のエスケープコー
              ドは、 printf コマンドの場合と同様に解釈されます。 マルチバイト文字には対応していま
              せん。  入力を処理する際、  クォートやバックスラッシュは特別扱いされません。 すなわ
              ち、 入力中のあらゆる文字が、 文字通りに解釈されます。 -d  オプションを指定すると、
              ファイル終端文字列は無効になり、  (xargs が作成するコマンドラインにおいて) 他の引数
              と同じように扱われます。 入力が、  項目を改行で区切っているだけのような単純な構成の
              場合には、   このオプションを使ってもよいですが、  ほとんどの場合、  なるべくなら、
              xargs--null を使うように、 出力側のプログラムを組み立てる方がよいです。

       -E eof-str
              eof-str をファイル終端文字列として設定します。 ファイル終端文字列が入力中の 1  行と
              して現れると、  それ以後の入力は無視されます。 -E-e も指定しない場合、 ファイル
              終端文字列は使用されません。

       -e[eof-str], --eof[=eof-str]
              このオプションは -E オプションの同義語です。-E の方を使ってください。 理由は、 そち
              らが POSIX に準拠しているのに対して、 こちらは準拠していないからです。 eof-str の部
              分が省略されると、 ファイル終端文字列が存在しないことになります。 -E-e も指定し
              ない場合、 ファイル終端文字列は使用されません。

       -I replace-str
              initial-arguments  中で文字列 replace-str が現れるすべての箇所を、 標準入力から読み
              込んだ名前で置き換えます。 なお、  標準入力中にクォートされていない空白があっても、
              それは入力項目の区切りにはなりません。  区切り文字は改行文字だけになります。  -x-L 1 の指定を暗に含みます。

       -i[replace-str], --replace[=replace-str]
              このオプションは、 replace-str が指定されていれば、 -Ireplace-str  の同義である。引
              数  replace-str が省略されていれば、 -I{} と同じことになります。 このオプションは非
              推奨です。-I を使ってください。

       -L max-lines
              1 コマンド行につき最大 max-lines 行の (空行ではない) 入力行を使用します。  入力行の
              行末に空白文字が付いていると、   その行は次の入力行に論理的に続いていることになりま
              す。 -x の指定を暗に含みます。

       -l[max-lines], --max-lines[=max-lines]
              -L オプションの同義語です。-L とは違って、 max-lines という引数を指定するかどうかは
              任意です。引数   max-lines  を指定しなかった場合は、  デフォルトの  1  が使用されま
              す。POSIX 規格では -L の方を使うことになっているので、 -l  オプションの使用はお勧め
              できません。

       -n max-args, --max-args=max-args
              1 コマンド行につき最大 max-args 個の引数を使用します。 作成されたコマンドラインが、
              コマンドライン長の上限を超過する場合は (-s オプション参照)、 max-args  より少ない引
              数が使用されることになります。  ただし、  -x オプションが指定されているときは別で、
              その場合は xargs が終了します。

       -P max-procs, --max-procs=max-procs
              同時に実行するプロセスの最大数を  max-procs  にします。   デフォルトは   1   です。
              max-procs  が  0  ですと、 xargs はできるだけ多くのプロセスを同時に実行しようとしま
              す。 -P オプションには、 -n-L  オプションを併せて使用するべきです。そうしない
              と、  おそらく exec 関数がたった一回しか実行されないことになります。 xargs の実行中
              に、 そのプロセスに SIGUSR1 シグナルを送れば、 同時に実行するコマンドの数を増やすこ
              とができます。  また、 SIGUSR2 シグナルを送れば、 その数を減らすことができます。 た
              だし、 実装が決めている上限を越えて増やすことはできませんし  (上限は  --show-limits
              を使えばわかります)、  1 より少なくもできません。 xargs は、 実行しているコマンドを
              終了させるわけではありません。 実行数を減らすように命じられたときは、  単に現在実行
              中のコマンドが二つ以上終了するのを待ち、 それから別のコマンドを開始します。

              注意してほしいのは、  共有リソースに対する並列アクセスをきちんと管理するのは、 呼び
              出されるプロセス側の問題であるということです。 たとえば、  複数のプロセスが標準出力
              に書き出そうとした場合、 出力順は不定です (そして混じり合ってしまうことが多い)。 そ
              うならないためには、 プロセス同士が何らかの形で協力し合う必要があります。  ロックス
              キーム (locking scheme) のようなものを使うのは、 そうした問題を避けるための一方法で
              す。 ただ一般にロックスキームを使っても、  出力順は適切に保証してくれるものの、  パ
              フォーマンスは低下します。  パフォーマンスが落ちるのが嫌ならば、 単純に各プロセスが
              それぞれ別の出力ファイルを作るように (あるいは別のリソースを使うように)  すればよい
              でしょう。

       -o, --open-tty
              コマンド実行に先がけて、  子プロセスにおいて stdin を /dev/tty として再オープンしま
              す。これは xargs を使って対話型アプリケーションを実行する場合に有用です。

       -p, --interactive
              コマンド行 1 行ごとに、 実行するかどうかをユーザーに尋ねるプロンプトを出し、 端末か
              ら 1 行読み込みます。コマンド行を実行するのは、 返答が `y' または `Y' で 始まるとき
              だけです。自動的に -t が指定されます。

       --process-slot-var=name
              複数の子プロセスを同時実行しているとき、 その各子プロセスで環境変数 name にユニーク
              な値をセットします。値は、 子プロセスが終了すると、 再利用されます。この機能は、 た
              とえば、 初歩的な負荷分散スキームで利用できます。

       -r, --no-run-if-empty
              標準入力に空白しか含まれていない場合は、  指定したコマンドを実行しません。   通常で
              は、  入力が全くない場合でも、  コマンドが一回は実行されます。 このオプションは GNU
              拡張です。

       -s max-chars, --max-chars=max-chars
              1 コマンド行につき最大 max-chars の文字を使用します。 この文字数には、 指定したコマ
              ンドと  initial-arguments、 それに各引数文字列の終端を示すヌル文字も含まれます。 指
              定できる値の上限は、 システム次第であり、 exec 関数に対する引数の最大長から、  現在
              の環境のサイズと   2048 バイトの余裕領域を引いたものです。もしその値が 128KiB  以上
              だったときは、 デフォルトの値には 128KiB が使用されます。 128KiB 未満のときは、  算
              出された上限がデフォルトの値になります。  1KiB は 1024 バイトです。制限がより厳しい
              場合でも、 xarg は自動的にそれに対応します。

       --show-limits
              コマンド行の長さの上限を表示します。コマンド行長の上限は、   オペレーティングシステ
              ム、 xargs が設定したバッファサイズ、 それに -s オプションによって決まります。xargs
              にコマンドライン長の上限の表示以外をさせたくない場合は、 入力を /dev/null  からパイ
              プで  xargs に渡してください (さらに --no-run-if-empty を指定した方がよいかもしれま
              せん)。

       -t, --verbose
              実行する前に、 コマンドラインを標準エラー出力に表示します。

       -x, --exit
              作成されたコマンド行がコマンド行長の上限を超過していたら (-s オプションを参照)、 終
              了します。

       --help xargs のオプションについて簡単に説明し終了します。

       --version
              xargs のバージョン番号を表示して、 終了します。

       オプション  --max-lines (-L, -l)、 --replace (-I, -i)、 --max-args (-n) は同時に指定するこ
       とはできません。これらを同時に指定した場合、 通常 xargs は、  コマンド行上の最後に指定され
       たオプションを利用します。つまり誤って指定された (最終分よりも前に指定された) オプション値
       はデフォルトにリセットされます。さらに xargs は警告情報を stderr  に出力します。この仕様に
       は例外があり、 max-args に対して特別な値 1 ('-n1') を指定した場合、 --replace オプションお
       よびその別名である -I-i の後ろであれば、 max-args は無視されます。これは相反する指定に
       ならないからです。

       find /tmp -name core -type f -print | xargs /bin/rm -f

       /tmp  ディレクトリ以下に core という名前のファイルを探して、 それを消去します。 改行や空白
       を含むファイル名があると、 正しく動作しないので、注意してください。

       find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

       /tmp ディレクトリ以下に core という名前のファイルを探して、 それを消去します。  ファイル名
       の処理に当たっては、 ファイル名やディレクトリ名に空白や改行が含まれていても、 適切に扱われ
       るようにしています。

       find /tmp -depth -name core -type f -delete

       /tmp ディレクトリ以下に core という名前のファイルを探して、 それを消去します。  上の例より
       もこちらの方が効率的です (なぜなら、 rm を実行するために fork(2) と exec(2) を使わないです
       みますし、 そもそも、 xargs のプロセスを必要としないからです)。

       cut -d: -f1 < /etc/passwd | sort | xargs echo

       システムの全ユーザーを列挙した簡潔なリストを生成します。

終了ステータス

       xargs の終了ステータスは以下のとおりです。

              0      成功した。

              123    指定したコマンドの実行が 1-125 のステータスで終了した。

              124    指定したコマンドが 255 のステータスで終了した。

              125    指定したコマンドがシグナルによって kill された。

              126    指定したコマンドが実行できない。

              127    指定したコマンドが見つからない。

              1      上記以外のエラーが起きた。

       128  以上の終了ステータスは、   致命的なシグナルのせいでプログラムが止まったことを示すため
       に、 シェルが使用しています。

規格への準拠

       GNU  xargs  version  4.2.9  以来、 ファイルの論理的な終端を示す指標 (a logical end-of-file
       marker) を持たないのが、  xargs  のデフォルトになっています。このことは  POSIX  (IEEE  Std
       1003.1, 2004 Edition) で認められています。

       -l  や -i オプションは 1997 年版の POSIX 規格には存在するが、 2004 年版の POSIX 規格には存
       在しません。従って、 それぞれ -L や -I の方を使うべきです。

       -o オプションは POSIX 規格を拡張したものであり、 BSD と互換性を図るためのものです。

       POSIX 規格は、 実装に当たって、 exec  関数に対する引数のサイズに上限を設けることを認めてい
       ます。 そして、 その上限は、 環境のサイズも含めて、 少なくとも 4096 バイトあればよいことに
       なっています。 移植性のあるスクリプトを書こうと思ったら、 これより大きいサイズを当てにして
       はいけません。  もっとも、 実際の上限がそんなに小さい実装に、 筆者は出会ったことはありませ
       ん。 --show-limits オプションを使えば、 使用中のシステムで有効な実際の上限を知ることができ
       ます。

バグ

       xargs を安全に使うことはできません。 なぜなら、 入力ファイルの一覧を作成する時間と、 xargs
       からの実行コマンドがその一覧を使用する時間との間に、 必ず差が発生するためです。 仮に、  他
       のユーザーがすでにシステムにアクセスしていたとして、 そのユーザーが、 その一瞬の隙にファイ
       ルシステムを操作して、 xargs が実行するコマンドの動作を、 こちらが意図していないファイルに
       無理矢理向けてしまう、 といったことができてしまいます。この議論や、 これに関連する問題につ
       いては、 findutils に含まれる Texinfo 文書の「Security  Considerations」という章でもっと細
       かく述べているので、  参照してください。 なお、 find-execdir オプションは、 より安全な
       方法として xargs の代わりに利用されることがよくあります。

       -I オプションを使うと、 標準入力から読み込まれた各行が、  内部的にバッファに保存されます。
       つまり、  -I オプションをつけたときに、 xargs が受けつける入力 1 行には、 長さの上限がある
       ということです。 この制限を回避するには、 -s オプションを使って、 xargs が使用するバッファ
       領域のサイズを増やして対処します。 もう 1 つの xargs を追加で実行すれば、 極端に長い行が発
       生しないようにできます。たとえば以下です。

       somecommand | xargs -s 50000 echo | xargs -I '{}' -s 100000 rm '{}'

       xargs の 1 つめの呼び出しでは、 入力行の長さに上限はありません。  これは  -I  オプションを
       使っていないからです。 xargs の 2 つめの呼び出しには、 上限設定がありますが、 処理できなく
       なるような 1 行は、 入ってこないのが明らかです。こうすることが理想的な解決法というわけでは
       ありません。  それよりも、 -I オプションが長さの制限を設けないでいる方が望ましいことです。
       だからこそ、 この問題を「バグ」セクションで説明しているわけです。 なおこの問題は、 find(1)
       の出力では発生しません。 find は 1 行に 1 ファイル名しか出力しないためです。

バグ報告

       GNU findutils オンラインヘルプ: <https://www.gnu.org/software/findutils/#get-help>
       翻訳に関するバグ報告 <https://translationproject.org/team/>

       その他の問題について GNU Savannah バグトラッカー経由での報告:
              <https://savannah.gnu.org/bugs/?group=findutils>
       GNU  findutils パッケージのメーリングリスト bug-findutils において議論されている全般的なト
       ピック:
              <https://lists.gnu.org/mailman/listinfo/bug-findutils>

著作権

       Copyright © 1990-2022 Free Software Foundation, Inc.  License GPLv3+: GNU GPL version 3 or
       later <https://gnu.org/licenses/gpl.html>.
       This  is free software: you are free to change and redistribute it.  There is NO WARRANTY,
       to the extent permitted by law.

関連項目

       find(1), kill(1), locate(1), updatedb(1), fork(2), execvp(3), locatedb(5), signal(7)

       完全なドキュメント <https://www.gnu.org/software/findutils/xargs>
       またローカルにおいては info xargs により参照できます。

                                                                                         XARGS(1)