bionic (1) xargs.1.gz

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

名前

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

書式

       xargs  [-0prtx]  [-E  eof-str]  [-e[eof-str]]  [--eof[=eof-str]]  [--null]  [-d  delimiter]  [--delimiter
       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]]

説明

       このマニュアルページは GNU 版 xargs の使用法を説明している。 xargs は、標準入力から空白や改行で区切られた
       一連の項目を読み込み (空白はダブルクォート、シングルクォート、バックスラッシュによって  保護できる)、それ
       を引き数にして、指定した  command を実行する (デフォルトのコマンドは /bin/echo である)。 このとき、ユーザ
       が command に対して指定した引き数 (上記書式の initial-arguments) があれば、 xargs  は標準入力から読み込ん
       だ一連の項目をその後ろに  追加していく (訳注: 作成されたコマンドラインが、コマンドライン長の上限を 越える
       場合や、オプションによる特別な指定がある場合は、入力を適宜分割して、   command   を複数回実行することにな
       る)。標準入力における空行は無視する。

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

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

オプション

       --arg-file=file
       -a file
              一連の項目を標準入力からではなく、 file から読み込む。なお、デフォルトでは、指定したコマンドを実行
              する際に、  標準入力が /dev/null に付け換えられるが、このオプションを使用した場合は、 標準入力の付
              け換えが起こらない (訳注: 別の言い方をすると、指定したコマンドの実行中、デフォルトでは  標準入力が
              使えなくなるが、このオプションを指定した場合は、 標準入力が使えるということである)。

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

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

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

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

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

       -I replace-str
              xargs  が実行するコマンドに対してユーザが引き数  (すなわち initial-arguments) を指定したとき、その
              initial-arguments 中にある replace-str  の部分すべてを、標準入力から読み込んだ名前で  置き換える。
              なお、空白は、クォートされていない場合も、入力される項目の区切りには  ならない。区切り記号は改行文
              字だけになるのだ。 -x-L 1 が自動的に設定される。

       --replace[=replace-str]
       -i[replace-str]
              このオプションは、 replace-str が指定されていれば、 -Ireplace-str の同義語であり、指定されていなけ
              れば、 -I{} の同義語である。このオプションは非推奨になっている。 -I を使った方がよい。

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

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

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

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

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

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

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

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

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

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

       --max-procs=max-procs
       -P max-procs
              同時に最多で max-procs プロセスまで指定したコマンドを実行する。デフォルトは  1  である。もし  max-
              procs  が  0 だと、 xargs はできるだけ多くのプロセスを同時に実行しようとする。 -P と一緒に -n オプ
              ションを使うとよい。さもないと、exec がたった一回しか 行われないかもしれない。

用例

       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 sh -c 'emacs "$@" < /dev/tty' emacs

       xargs の標準入力からファイルのリストを受け取り、Emacs を必要なだけ次々と 立ち上げて、それを編集する。この
       例は BSD の -o オプションと同じことを実現するが、こちらの方が柔軟性があり、 多くのシステムで利用できる。

終了ステータス

       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 の方を使うべきである。

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

関連項目

       find(1), locate(1), locatedb(5), updatedb(1), fork(2), execvp(3), Finding  Files  (on-line  in  Info,  or
       printed)

バグ

       -L  オプションと -I オプションを組み合わせても、うまく行かない。組み合わせて使えた方が よいのかもしれない
       が。

       [訳注]: -I オプションの説明にあるように、 -I replace-str を指定すると、 -L 1 が自動的に設定される。ここで
               言っているのは、現状では  -L 2 や -L 3 を -I と一緒に使っても、期待する効果を得られないということ
               である。

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

       -I オプションを使うと、標準入力から読み込まれた各行は内部的にバッファされる。 これは、 -I  オプションを付
       けて使ったとき、  xargs  が受け付ける入力行一行の長さに上限があるということだ。  この制限を回避するために
       は、 -s オプションを使って、 xargs が使用するバッファ空間のサイズを増やしてやればよい。さらに、 xargs  を
       もう一つ実行すれば、 長すぎる行の出現を確実に避けることができる。 たとえば、

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

       この例では、  xargs  の最初の実行には、入力行の長さの上限がない。 -I オプションを使っていないからである。
       xargs の二番目の実行には、そうした上限があるが、処理できる以上の長さの行に 絶対に出会わないようになってい
       る。これが理想的な解決法だ というのではない。むしろ、 -I オプションによって入力行の長さに上限ができない方
       がよいのであり、 だからこそ、この問題を「バグ」セクションで論じているのである。 なお、この問題は  find(1)
       の出力では起きない。 find は 1 行に 1 ファイル名しか出力しないからだ。

       バグ報告の最善の方法は、 http://savannah.gnu.org/bugs/?group=findutils にある書式を使用することだ。そうす
       れば、問題解決の進行状態を 追うことができるからである。xargs(1) や findutils パッケージ全般についてのその
       他のご意見は、    bug-findutils    メーリングリストにお出しになればよい。メーリングリストに参加するには、
       bug-findutils-request@gnu.org 宛てに E メールを送っていただきたい。

                                                                                                        XARGS(1)