とあるバッチ処理を行う際、あらかじめテキストファイルにあるデータをxargsに流し込んでループしたいなーと思い、調べてみました。
TL;DR
I(大文字のi)
オプションを使え!!
方法
以下のように、引数のデータがあらかじめ入ったテキストファイルがあります。
args.txt
aaa bbb ccc
何も考えずにxargsにこのテキストファイルを入力してやると、、、
cat args.txt | xargs echo line is
すると、
line is aaa bbb ccc
となります。これは期待した結果ではありません。
そこで、I(大文字のi)
オプションを使います。
cat args.txt | xargs -I arg echo line is arg
すると、
line is aaa line is bbb line is ccc
一行ずつ変換されます。
ちなみに、I
オプションに指定する文字列は以下のようにしている例もありました。
cat args.txt | xargs -I {} echo line is {}
ここら辺は可読性を意識する必要があるか、みたいな各事情に応じて使い分けてもいいかなと思いました。
おまけ - pオプション
こう言う「変換して実行する」という例は、事前に正しく変換されたか確認したいです。
そこでp
オプションを使うことができます。
p
オプションを使うことで、変換後のコマンドが表示され、実行するかどうかを選択することができます。
早速ためしてみます。
cat args.txt | xargs -p -I arg echo line is arg
すると
echo line is aaa?...
ここでy
を押せば実行されますし、n
を押せば実行されません。
echo line is aaa?...y line is aaa echo line is bbb?...n echo line is ccc?...n
まとめ
- xargsの
I
オプションを使えばテキストファイルの内容を行ごとに処理できる。 p
オプションを使えば、事前に実行するかどうかの確認が可能。 xargs奥深い。