はじめに

こんにちは!今回はxargsコマンドについて解説します。

xargsは標準入力から引数を構築して、別のコマンドに渡すコマンドです。findやgrepの結果を他のコマンドで処理したり、大量のファイルを一括操作したり、日々の運用を効率化する強力なコマンドですね。

「パイプの後ろでファイル名を受け取る」って感じです。実は複雑に見えますが、慣れると超便利ですよ。

xargsコマンドとは

xargsは、標準入力から読み込んだ行をコマンドの引数に変換して実行する外部コマンドです。

通常のパイプ(|)は標準入力としてテキストを受け渡しますが、xargsはそれをコマンドの引数に変換します。find、grep、echoなどの結果をファイル名として他のコマンドに渡したい場合に非常に便利。大量のファイル操作を効率的に行えます。

基本構文

1
xargs [オプション] コマンド

標準入力から引数を読み込んで、指定したコマンドに渡します。デフォルトでは標準入力の各行が引数になります。

主なオプション

オプション 説明
-I {} 占有文字列(デフォルト: スペース区切り)
-n NUM 1回に渡す引数の最大個数
-d DELIM 区切り文字を指定(デフォルト: スペース/改行)
-0 NUL文字で区切られた入力を処理
-p 実行前に確認を取る(prompt)
-r 標準入力が空の場合は実行しない
-t 実行するコマンドを表示
--no-run-if-empty 入力がない場合は実行しない

使用例

例1: findの結果をrmで削除

1
find . -name "*.tmp" | xargs rm

実行結果:

1
(マッチしたすべての.tmpファイルが削除される)

最も一般的な使い方。findで見つけたファイルをrmで一括削除。

例2: 確認付きで削除(-p オプション)

1
find . -name "*.tmp" | xargs -p rm

実行結果:

1
rm file1.tmp file2.tmp ?

-pで実行前に確認。危険な操作の時に便利。

例3: echoで渡したファイルをcatで表示

1
echo -e "file1.txt\nfile2.txt" | xargs cat

実行結果:

1
(file1.txt と file2.txt の内容が表示される)

複数ファイルの内容を連続表示。

例4: 1回の実行で1つの引数のみ(-n 1)

1
echo -e "file1\nfile2\nfile3" | xargs -n 1 echo

実行結果:

1
2
3
file1
file2
file3

-n 1で1回に1つの引数だけ渡します。

例5: 複数の引数をまとめて渡す(-n NUM)

1
echo -e "file1\nfile2\nfile3\nfile4" | xargs -n 2 echo

実行結果:

1
2
file1 file2
file3 file4

-n 2で2つずつ渡します。cpやrmで複数ファイル処理に便利。

例6: grepの結果を処理

1
grep -l "error" *.log | xargs wc -l

実行結果:

1
2
3
  10 error1.log
  20 error2.log
  30 total

「error」を含むログファイルを見つけて、行数をカウント。

例7: 占有文字列(-I)を使った置換

1
echo -e "file1\nfile2\nfile3" | xargs -I {} echo "Processing: {}"

実行結果:

1
2
3
Processing: file1
Processing: file2
Processing: file3

-I {}で{}を引数に置換。複雑な処理に便利。

例8: -Iで複数ファイルコピー

1
ls *.txt | xargs -I {} cp {} backup/{}

実行結果:

1
(すべての.txtファイルがbackup/にコピーされる)

占有文字列を使ったコピー例。ファイル名の保持が簡単。

例9: findとxargsの強力な組み合わせ

1
find . -name "*.log" -type f | xargs du -sh

実行結果:

1
2
3
1.2M ./app.log
2.3M ./error.log
0.8M ./debug.log

ログファイルのサイズを表示。

例10: NUL区切り入力(-0)でスペースを含むファイルに対応

1
find . -name "*.txt" -print0 | xargs -0 wc -l

実行結果:

1
2
3
  50 ./file with space.txt
  30 ./another file.txt
  80 total

スペースを含むファイル名も正しく処理。

例11: 入力がない場合の処理(-r)

1
find . -name "nonexistent" | xargs -r rm

実行結果:

1
(何も表示されない。エラーも出ない)

-r(–no-run-if-empty)でマッチなしの場合は実行しない。

例12: 実行内容を確認(-t)

1
echo -e "file1\nfile2" | xargs -t rm

実行結果:

1
2
rm file1 file2
(実際に実行される)

-tで実行するコマンドを表示してから実行。

Tips・注意点

findとxargsの組み合わせは必須

1
2
3
4
5
6
7
8
# ❌ ファイルが多い場合エラーになる
find . -name "*.log" | xargs rm

# ✅ 安全(NUL区切りで対応)
find . -name "*.log" -print0 | xargs -0 rm

# ✅ または-rで安全
find . -name "*.log" | xargs -r rm

findとxargsを使う場合はスペース対策を。

スペースを含むファイル名への対応

1
2
3
4
5
6
7
8
# ❌ スペース含むファイル名で失敗
find . -name "*.txt" | xargs cat

# ✅ -print0 と -0 で対応(推奨)
find . -name "*.txt" -print0 | xargs -0 cat

# ✅ -I で1つずつ処理
find . -name "*.txt" | xargs -I {} cat {}

スペースを含むファイル名がある場合は-print0-0の組み合わせが最適。

複雑な処理は占有文字列(-I)を使う

1
2
3
4
5
# シンプル
ls *.txt | xargs rm

# 複雑な処理
ls *.txt | xargs -I {} sh -c 'echo "Processing: {}" && cat {}'

引数を複数の場所で使う場合は-I

危険な操作は必ず-pで確認

1
2
3
4
5
# 危険な操作は必ず確認
find . -type f -name "*.old" | xargs -p rm

# または -t で内容確認
find . -type f -name "*.old" | xargs -t rm

削除やアーカイブなどの危険な操作は確認を。

実践的な使い方

古いログファイルを圧縮

1
find /var/log -name "*.log" -mtime +30 | xargs gzip

30日以上前のログファイルをgzipで圧縮。ディスク容量を節約。

重複ファイルを削除

1
find . -type f -name "*.bak" | xargs rm -f

バックアップファイルを一括削除。

パーミッション変更

1
find . -type f -name "*.sh" | xargs chmod +x

すべてのシェルスクリプトに実行権限を付与。

複数ファイルの検索・置換

1
find . -name "*.txt" -type f | xargs sed -i 's/old/new/g'

すべてのテキストファイルで「old」を「new」に置換。

バックアップ作成

1
ls *.conf | xargs -I {} cp {} {}.backup

設定ファイルをバックアップ。

まとめ

xargsコマンドのポイント:

  • 標準入力から引数を構築して別のコマンドに渡す
  • -I {}: 占有文字列で複雑な処理に対応
  • -n NUM: 1回に渡す引数数を制限
  • -p: 実行前に確認
  • -0: NUL区切りでスペース対応
  • -r: 入力がない場合は実行しない
  • -t: 実行内容を表示
  • findとの組み合わせで超強力
  • よく使う組み合わせ: find | xargs, grep -l | xargs, ls | xargs -I {}

find、grep、xargsの組み合わせは実務のコマンドライン操作の中核。使いこなせると作業が飛躍的に効率化されますよ!