Home
1331 words
7 minutes
【Unix】xargsコマンドの解説
2025-02-22

最終更新:2025-02-22

xargsコマンドは、標準入力から受け取った引数を指定されたコマンドに対して効率的に渡すためのツールである。大量の引数を扱う場合や、パイプラインの中でデータを展開して使用する際に非常に有用であり、シェル操作を柔軟に拡張することができる。

xargsは、多様なオプションを持ち、実行するコマンドや引数の扱いを細かく制御することが可能である。本稿では、主要なオプションを具体的に説明するとともに、ハンズオン例を通してその利用方法を解説する。

主なオプションの解説#

以下、xargsの各オプションについて具体的に説明する。

  • -0, —null
    入力の区切り文字としてヌル文字 (ASCII NUL) を利用する。

    • 例:find . -type f -print0 | xargs -0 rm
      ファイル名にスペースや改行が含まれている場合も正確に処理できる。
  • -a file, —arg-file=file
    標準入力ではなく、指定したファイルから引数を読み込む。

    • 例:xargs -a args.txt echo
      args.txtに記述された各行が引数としてechoに渡される。
  • -d delim, —delimiter=delim
    入力の区切り文字を指定する。標準では空白や改行で区切られるが、それ以外の文字でも指定可能である。

    • 例:echo "one,two,three" | xargs -d, echo
      カンマを区切り文字とし、各要素がechoに渡される。
  • -E eof-str, —eof=eof-str
    入力ストリームの終了を示す文字列を指定する。指定した文字列が現れた時点で引数の読み込みを終了する。

    • 例:入力が「END」で終わる場合、xargs -E END command とする。
  • -I replace-str
    標準入力からの各引数を、指定した文字列 replace-str と置換してコマンドに渡す。複数の場所に同じ引数を挿入する場合に有用である。

    • 例:echo "file1 file2" | xargs -I {} cp {} backup/
      各ファイル名が {} の位置に展開される。
  • -L number, —max-lines=number
    一度に読み込む行数を指定する。各コマンド実行ごとに指定した行数分だけ入力を読み込み、その都度コマンドを実行する。

    • 例:cat list.txt | xargs -L 2 echo
      2行ごとにechoを実行する。
  • -n number, —max-args=number
    一度に渡す引数の数を限定する。大量の引数を分割して扱いたい場合に使用する。

    • 例:echo "a b c d e" | xargs -n 2 echo
      2つずつ引数が渡され、複数回に分けてechoが実行される。
  • -P max-procs, —max-procs=max-procs
    並列処理数を指定する。複数のコマンドを同時に実行することで、処理速度の向上を図る。

    • 例:find . -type f | xargs -P 4 -n 1 md5sum
      最大4プロセス並列で各ファイルのMD5ハッシュを計算する。
  • -r, —no-run-if-empty
    標準入力が空の場合、指定したコマンドを実行しない。意図しない実行を防ぐために重要である。

    • 例:入力がなかった場合にコマンドが起動されず、安全にスクリプトを実行できる。
  • -s size, —max-chars=size
    一度に渡す全引数のバイト数の上限を指定する。大きすぎる引数リストを避けるために利用する。

    • 例:xargs -s 1024 command
      1回のコマンド実行で1024バイトを超えないように引数が分割される。

ハンズオン#

以下に、実際のシナリオを用いたハンズオン例を示す。

1. ファイル削除の例#

ディレクトリ内の全ての.logファイルを削除するためには、findxargsを組み合わせて利用することが考えられる。

find . -name "*.log" -type f -print0 | xargs -0 rm -f

この例では、findコマンドで見つかった各.logファイルのパスがヌル文字区切りで渡され、xargs -0がそのままrm -fに渡すことで、正確にファイル削除が実施される。

2. ファイルの内容を表示する例#

引数ファイルfiles.txtに記述された複数のファイル名の内容を確認する際、以下のように実行する。

xargs -a files.txt -n 1 cat

この例では、files.txtから1件ずつファイル名が読み込まれ、catコマンドでその内容が表示される。

3. 並列処理によるファイルのMD5ハッシュ計算#

並列処理により、ファイルのMD5ハッシュ値を計算する例である。

find . -type f -print0 | xargs -0 -P 4 -n 1 md5sum

この例では、見つかったファイルに対して、最大4つのプロセスで並列にmd5sumが実行され、処理効率が向上する。

4. 特定文字列の置換を伴うコマンド実行例#

各行内のファイル名を特定の位置に挿入して処理する例である。

echo "file1 file2 file3" | xargs -I {} cp {} backup/{}

この例では、各ファイル名が{}と置き換えられ、元のファイルをbackupディレクトリ内にコピーする操作が実行される。

xargsコマンドは、パイプライン処理において引数の展開や分割、並列処理など複雑な処理を効率的に実現するために非常に有用である。各オプションを理解し、適切に組み合わせることで、Unixシェルスクリプトの柔軟性と処理効率を大幅に向上させることが可能である。

【Unix】xargsコマンドの解説
https://ss0832.github.io/posts/20250222_xargs_command_guide/
Author
ss0832
Published at
2025-02-22