Linuxでコマンドライン処理をしていて、こんな経験はありませんか?
- 「findで見つけたファイルを一括で削除したい」
- 「リストに書かれた複数のファイルを同時に処理したい」
- 「パイプで渡されたデータを、別のコマンドの引数として使いたい」
そんなときに便利なのが「xargs」コマンドです。
findやechoなどと組み合わせることで、大量のデータを効率的に処理できる、まさにコマンドラインの橋渡し役的な存在です。
この記事では、xargsの基本構文から実践的な活用例、注意点までを詳しく紹介します。
xargsとは?

簡単に言うと
xargsは、標準入力(stdin)を引数として受け取り、それを指定したコマンドに渡して実行するためのコマンドです。
身近な例で考えてみよう
工場の組み立てラインを例にしてみましょう:
- コンベア:前の工程から部品が流れてくる(パイプ)
- xargs:部品を受け取って、適切な数だけまとめる
- 次の工程:まとめられた部品を加工する(実行コマンド)
Linuxでも同じように、前のコマンドの出力を受け取って、次のコマンドに適切な形で渡すのがxargsの役割です。
基本構文
コマンド | xargs 実行コマンド
xargsが必要な理由
問題のある例:
# これはエラーになる
echo "file1.txt file2.txt file3.txt" | rm
# rmコマンドは標準入力を受け取れない
xargsを使った解決例:
# これなら正常に動作
echo "file1.txt file2.txt file3.txt" | xargs rm
# xargsがファイル名を引数としてrmに渡す
xargsの動作イメージ
処理段階 | 内容 | 例 |
---|---|---|
入力 | 前のコマンドからデータを受信 | file1.txt file2.txt file3.txt |
整理 | データを適切な引数に分割 | file1.txt , file2.txt , file3.txt |
実行 | 次のコマンドに引数として渡す | rm file1.txt file2.txt file3.txt |
xargsの基本的な使い方
最もシンプルな例
# 複数のファイル名を一度にechoに渡す
echo "apple banana orange" | xargs echo
# 出力: apple banana orange
# 比較:xargsを使わない場合
echo "apple banana orange"
# 出力: apple banana orange
一見同じに見えますが、重要な違いがあります:
- xargsを使わない場合:文字列として出力
- xargsを使う場合:個別の引数として処理
より実用的な例
# ファイルリストを作成
echo "file1.txt file2.txt file3.txt" > filelist.txt
# リストのファイルをすべて作成
cat filelist.txt | xargs touch
# 確認
ls -l file*.txt
# -rw-r--r-- 1 user user 0 Jan 15 10:30 file1.txt
# -rw-r--r-- 1 user user 0 Jan 15 10:30 file2.txt
# -rw-r--r-- 1 user user 0 Jan 15 10:30 file3.txt
よく使うxargsの使用例
1. ファイルの一括削除
# .logファイルをまとめて削除
ls *.log | xargs rm
# より安全な方法(事前確認)
ls *.log | xargs ls -l # まず確認
ls *.log | xargs rm # 確認後に削除
2. findとの組み合わせ(最も強力)
# .tmpファイルを再帰的に探して削除
find . -name "*.tmp" | xargs rm
# 7日以上古いログファイルを削除
find /var/log -name "*.log" -mtime +7 | xargs rm
# 空のディレクトリを削除
find . -type d -empty | xargs rmdir
3. ファイル内容の一括処理
# 複数のファイルの行数をカウント
find . -name "*.txt" | xargs wc -l
# 複数のファイルで文字列を検索
find . -name "*.py" | xargs grep "import"
# ファイルの権限を一括変更
find . -name "*.sh" | xargs chmod +x
4. ダウンロードやバックアップ
# URLリストからファイルを一括ダウンロード
cat urls.txt | xargs -n 1 wget
# ファイルを別のディレクトリにコピー
ls *.pdf | xargs -I {} cp {} /backup/
オプションと応用テクニック
-n オプション:一度に処理する数を指定
# ファイルを2個ずつechoに渡す
echo "file1 file2 file3 file4" | xargs -n 2 echo
# 出力:
# file1 file2
# file3 file4
# ファイルを1個ずつ処理
cat filelist.txt | xargs -n 1 ls -l
実用例:
# サーバーへの負荷を軽減しながらファイルをアップロード
cat upload_list.txt | xargs -n 1 scp user@server:/path/
-I オプション:置換文字の指定
# 各ファイルを個別に処理
echo "apple banana orange" | xargs -I {} echo "fruit: {}"
# 出力:
# fruit: apple
# fruit: banana
# fruit: orange
# ファイルの拡張子変更
ls *.txt | xargs -I {} mv {} {}.backup
実用例:
# 画像ファイルのリサイズ
find . -name "*.jpg" | xargs -I {} convert {} -resize 800x600 resized_{}
# ファイルの暗号化
cat secret_files.txt | xargs -I {} gpg --encrypt --recipient user@example.com {}
-0 オプション:null文字区切り(重要)
# スペースを含むファイル名でも安全に処理
find . -name "*.txt" -print0 | xargs -0 rm
# 通常の方法(危険)
find . -name "*.txt" | xargs rm # "my file.txt"が"my"と"file.txt"として処理される
# 安全な方法
find . -name "*.txt" -print0 | xargs -0 rm # "my file.txt"として正しく処理
-p オプション:実行前に確認
# 削除前に確認メッセージを表示
find . -name "*.tmp" | xargs -p rm
# rm ./temp1.tmp ./temp2.tmp ?... y
-t オプション:実行コマンドを表示
# 実行されるコマンドを表示
echo "file1 file2" | xargs -t rm
# rm file1 file2
# (実際にrmコマンドが実行される)
実践的な応用例

ログ解析での活用
# 複数のログファイルからエラーを検索
find /var/log -name "*.log" | xargs grep -l "ERROR"
# アクセスログから特定IPの解析
find . -name "access.log*" | xargs grep "192.168.1.100" | wc -l
# 複数のログファイルの最新エントリを確認
ls /var/log/*.log | xargs -I {} tail -1 {}
開発作業での活用
# ソースコードの一括検索
find . -name "*.py" | xargs grep -n "TODO"
# 古いバックアップファイルの削除
find . -name "*.py.bak" -mtime +30 | xargs rm
# コードの権限統一
find ./src -name "*.py" | xargs chmod 644
find ./scripts -name "*.sh" | xargs chmod 755
システム管理での活用
# 特定のプロセスIDを一括終了
ps aux | grep "apache" | awk '{print $2}' | xargs kill
# ディスク容量の大きいファイルを確認
find /home -size +100M | xargs ls -lh
# 設定ファイルのバックアップ
echo "/etc/nginx/nginx.conf /etc/apache2/apache2.conf" | xargs -I {} cp {} {}.backup
データ処理での活用
# CSVファイルの一括処理
find . -name "*.csv" | xargs -I {} python process_csv.py {}
# 画像ファイルの一括変換
find ./images -name "*.png" | xargs -I {} convert {} {}.jpg
# アーカイブファイルの一括展開
ls *.tar.gz | xargs -I {} tar -xzf {}
他のコマンドとの組み合わせパターン
findとの黄金コンビ
# パターン1:条件に合うファイルの一括処理
find /path -name "pattern" | xargs command
# パターン2:スペースを含むファイル名対応
find /path -name "pattern" -print0 | xargs -0 command
# パターン3:ディレクトリとファイルを分けて処理
find /path -type f -name "*.txt" | xargs grep "search_term"
find /path -type d -empty | xargs rmdir
grepとの組み合わせ
# 複数ファイルでの検索
find . -name "*.log" | xargs grep "ERROR"
# 検索結果をファイルに保存
find . -name "*.py" | xargs grep -l "import pandas" > python_files_using_pandas.txt
# 検索結果の統計
find . -name "*.txt" | xargs grep -c "keyword" | awk -F: '{sum+=$2} END {print sum}'
lsとawkとの組み合わせ
# 特定の条件でファイル処理
ls -la | awk '{if($5>1000000) print $9}' | xargs rm
# ファイルサイズの合計計算
find . -name "*.log" | xargs ls -l | awk '{sum+=$5} END {print sum}'
注意点とトラブル回避
1. ファイル名のスペースや特殊文字問題
問題のある例:
# スペースを含むファイル名で問題発生
touch "my file.txt" "your file.txt"
ls *file.txt | xargs rm # "my", "file.txt", "your", "file.txt"として処理される
解決方法:
# -print0と-0オプションを使用
find . -name "*file.txt" -print0 | xargs -0 rm
# または-Iオプションを使用
ls *file.txt | xargs -I {} rm "{}"
2. 削除コマンドでの安全対策
# ❌ 危険:いきなり削除
find . -name "*.tmp" | xargs rm
# ⭕ 安全:まず確認
find . -name "*.tmp" | xargs ls -l # 内容確認
find . -name "*.tmp" | xargs -p rm # 実行前確認
find . -name "*.tmp" | xargs -t rm # 実行コマンド表示
3. 引数の上限問題
# 大量のファイルがある場合の対策
find . -name "*.txt" | xargs -n 100 process_command
# または
find . -name "*.txt" -exec process_command {} +
4. エラーハンドリング
# エラーが発生しても処理を続行
find . -name "*.log" | xargs -r grep "ERROR" || echo "No files found"
# 空の入力に対する処理
echo "" | xargs -r echo "This won't run" # -rオプションで空入力をスキップ
パフォーマンスの最適化

xargs vs -exec の比較
# find -exec:各ファイルごとにコマンド実行(遅い)
find . -name "*.txt" -exec wc -l {} \;
# find -exec +:複数ファイルをまとめて実行(速い)
find . -name "*.txt" -exec wc -l {} +
# xargs:複数ファイルをまとめて実行(速い)
find . -name "*.txt" | xargs wc -l
並列処理での高速化
# GNU parallel(xargsの高機能版)
find . -name "*.jpg" | parallel convert {} {.}.png
# xargsでの疑似並列処理
find . -name "*.txt" | xargs -n 1 -P 4 process_file
# -P 4: 最大4つのプロセスを並列実行
実際のシェルスクリプトでの活用例
バックアップスクリプト
#!/bin/bash
# 重要ファイルのバックアップ
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
# 設定ファイルをバックアップ
echo "/etc/nginx/nginx.conf /etc/apache2/apache2.conf /etc/ssh/sshd_config" | \
xargs -I {} cp {} "$BACKUP_DIR/"
# ログファイルをバックアップ(7日以内のもの)
find /var/log -name "*.log" -mtime -7 | \
xargs -I {} cp {} "$BACKUP_DIR/"
echo "Backup completed to $BACKUP_DIR"
クリーンアップスクリプト
#!/bin/bash
# 一時ファイルのクリーンアップ
# 古い一時ファイルを削除
find /tmp -name "*.tmp" -mtime +7 -print0 | xargs -0 rm -f
# 空のディレクトリを削除
find /tmp -type d -empty | xargs rmdir 2>/dev/null
# ログファイルの圧縮
find /var/log -name "*.log" -size +10M | \
xargs -I {} sh -c 'gzip "$1" && mv "$1.gz" /var/log/archive/' _ {}
echo "Cleanup completed"
まとめ:xargsでLinuxライフが劇的に変わる!
重要なポイント
- xargsは標準入力を引数に変換する橋渡し役
- findとの組み合わせが最も強力
- スペースを含むファイル名には-0オプションが必須
- 削除系コマンドでは必ず事前確認を
習得の順番
- 基本的な使い方:
echo "files" | xargs command
- findとの組み合わせ:
find . -name "*.txt" | xargs command
- オプションの活用:
-n
,-I
,-0
の使い分け - 安全な削除操作:
-p
,-t
オプションでの確認 - 実践的な応用:ログ解析、バックアップスクリプト
覚えておきたい基本パターン
用途 | パターン | 頻度 |
---|---|---|
ファイル一括処理 | find . -name "*.ext" | xargs command | ★★★★★ |
安全な削除 | find . -name "*.tmp" | xargs -p rm | ★★★★★ |
スペース対応 | find . -name "*.txt" -print0 | xargs -0 command | ★★★★☆ |
個別処理 | cat list | xargs -I {} command {} | ★★★☆☆ |
並列処理 | find . -name "*.txt" | xargs -n 1 -P 4 command | ★★☆☆☆ |
実践のコツ
- まずは-tオプションで確認:実行内容を把握してから本実行
- 削除前は必ずls -lで確認:予期しないファイルを削除しないように
- スペースを含むファイルを扱う場合は-0オプション:トラブルの大部分を回避
- 大量処理では-nオプションで分割:システムへの負荷を軽減
よくある間違いと対策
間違い | 対策 |
---|---|
スペースを含むファイル名の誤処理 | -print0 と-0 オプションを使用 |
削除前の確認不足 | -p オプションで実行前確認 |
引数の上限エラー | -n オプションで処理数を制限 |
空入力でのエラー | -r オプションで空入力をスキップ |
コメント