オプションを使用した xargs の高度な使い方
この最後のステップでは、複雑なタスクに対して xargs
をさらに強力にするいくつかの高度なオプションを探ります。
制限付きの並列処理で xargs を使用する
-P
オプションを使用すると、複数のプロセスを並列で実行でき、多くのファイルに対する操作を大幅に高速化できます。
mkdir -p ~/project/data/processing
touch ~/project/data/processing/large_file_{1..20}.dat
並列処理をデモンストレーションするために、これらのファイルの処理を sleep
コマンドでシミュレートしましょう。
ls ~/project/data/processing/*.dat | xargs -P 4 -I {} sh -c 'echo "Processing {}..."; sleep 1; echo "Finished {}"'
このコマンドでは、以下のことが行われます。
-P 4
は、xargs
に最大 4 つのプロセスを並列で実行するよう指示します。
- 各プロセスは 1 秒かかります(
sleep
コマンド)。
- 並列処理を行わない場合、20 個のファイルを処理するのに少なくとも 20 秒かかります。
- 4 つのプロセスを並列で実行すると、約 5 秒で完了するはずです。
-n で引数の数を制限する
-n
オプションは、各コマンド実行に渡される引数の数を制限します。
echo {1..10} | xargs -n 2 echo "Processing batch:"
これにより、以下のように出力されます。
Processing batch: 1 2
Processing batch: 3 4
Processing batch: 5 6
Processing batch: 7 8
Processing batch: 9 10
echo
の各実行には、正確に 2 つの引数が渡されます。
-p で実行前に確認を求める
-p
オプションは、各コマンドを実行する前にユーザーに確認を求めます。
echo file1 file2 file3 | xargs -p rm
これにより、以下のように表示されます。
rm file1 file2 file3 ?
コマンドを実行するには 'y' を入力して Enter キーを押し、スキップするには 'n' を入力します。これは、潜在的に破壊的な操作に役立ちます。
注意: この実験環境では、'n' を入力する代わりに Ctrl+C を押してコマンドをキャンセルする必要がある場合があります。
-r で空の入力を処理する
-r
オプション(--no-run-if-empty
とも呼ばれます)は、入力がない場合に xargs
がコマンドを実行しないようにします。
## 入力がなくても 'echo' を実行しようとする
echo "" | xargs echo "Output:"
## 入力がない場合は 'echo' を実行しない
echo "" | xargs -r echo "Output:"
最初のコマンドは、実際の入力がなくても「Output:」を出力しますが、2 番目のコマンドは echo
コマンドをまったく実行しません。
実用的な例: ファイルバックアップスクリプトの作成
これまで学んだことを組み合わせて、実用的な例を作成しましょう。すべての設定ファイルを見つけてバックアップするスクリプトです。
cat > backup_configs.sh << EOF
#!/bin/bash
## タイムスタンプ付きのバックアップディレクトリを作成
BACKUP_DIR=~/project/data/backups/\$(date +%Y%m%d_%H%M%S)
mkdir -p \$BACKUP_DIR
## すべての設定ファイルを見つけてバックアップディレクトリにコピー
find ~/project/data/config -name "*.conf" -print0 | xargs -0 -I {} cp {} \$BACKUP_DIR/
## バックアップされた内容を表示
echo "Backed up the following files to \$BACKUP_DIR:"
ls -l \$BACKUP_DIR
EOF
chmod +x backup_configs.sh
では、バックアップスクリプトを実行しましょう。
./backup_configs.sh
このスクリプトは、以下のことを行います。
- タイムスタンプ付きのバックアップディレクトリを作成します。
- 設定ディレクトリ内のすべての
.conf
ファイルを見つけます。
- それらをバックアップディレクトリにコピーします。
- バックアップされたファイルをリストアップします。
出力には、作成されたバックアップディレクトリとバックアップされたファイルが表示されます。