そんなときはxargs
いつも xargs というコマンド名を忘れてしまう自分のためにメモ。
ディレクトリ以下特定の拡張子を持つファイルに対して特定のコマンドを実行したいんだけど、コマンドがファイル1つしか受け付けないか、ファイルがかなり多くて面倒、という場合に使えます。
たまにスクリプトで書けば良いじゃん、と思うけど、ワンライナーでないと使う気がしないし;;
使い方(末尾に追加するだけでいい場合)
ls *.txt | xargs -l echo abcdef
# 結果は・・・(ディレクトリにfile1.txtとsample.txtが存在)
# abcdef file1.txt
# abcdef sample.txt
中身はというと・・・
- ls *.txt でファイルとかのリストアップ(findとか別のコマンドでもOK)
- xargs -l で後ろに記載されているコマンドに引数を追加
- echo abcdef [+ 2で追加されたファイル名] でコマンドを実行(ここは使いたいコマンドを。)
という感じです。
ちなみに、2の -l スイッチは -n 1 と同じで複数のリストがある場合に1個ずつパラメータにセットして実行してくれるみたいです。
つけない場合は echo file1.txt sample.txt という感じになります。
使い方(コマンドの真ん中に追加したい)
最後じゃなくてコマンドの真ん中に足したいんだけど・・・というときは
ls *.txt | xargs -l -iREPLACE echo abc REPLACE def
# または
ls *.txt | xargs -l --replace=REPLACE echo abc REPLACE def
# 結果は・・・
# abc file1.txt def
# abc sample.txt def
REPLACEが置き換える文字列で、自由に指定できます。
-i または --replace スイッチで文字列を指定して、後ろのコマンドにその文字列を入れると入れ換えて実行してくれることがわかります。
まとめ
xargsを使うとシェルスクリプトを作らなくてもワンライナーでファイルとかを一括処理できる。
こういうコマンドを見てると本当にシェルってかゆいところに手が届くなぁ、とつくづく感じます。
参考
今回は以下を参考にさせていただきました。
xargs コマンド - hydroculのメモ
Linuxコマンド集 - 【xargs】標準入力から生成したコマンドラインを実行する:ITpro