xargs で複数行のコマンドを実行したい。
出来ない・・・
ls *.txt | xargs -I@ echo @ ; sleep 1
forループならできるんだけど、for ループだとどうしても不便。
xargs でシェルコマンドを作って渡す.
xargs だと限界があるので、もうシェルの文字列にして渡すしか、他に選択肢がない。
ls *.txt | xargs -I@ sh -c 'echo @ ; sleep 1'
これなら動くんです。動くんです。
xargs が1つ実行するたびに、 sh -c 'echo @ ' の@ の部分にファイルを文字列として入れて渡してくれる。
bash でもいい
sh だと機能が少ないので、bashにしてやるという手段も取れる。
ls *.txt | xargs -I@ bash -c 'echo @ ; sleep 1'
条件分岐も
もうここまできたら、なんでもあり。シェルに文字列渡すんでス。ここなら何でもありです。条件の入力だってできちゃう。
ls *.txt | xargs -I@ bash -c ' [[ @ =~ 2017 ]] echo @ ; sleep 1'
脱 for文
これで、for がなくても戦える。
なんだけど、ここまでする必要あるかなぁ。コマンドを履歴に残したいとかパラレルに実行したいときには相当便利だけど、コードメンテしにくい。。。両刃の剣か。