くんすとの備忘録

IT系技術メモ

移転しました。

15秒後に自動的にリダイレクトします。

【bash】whileの代わりにxargsでループ処理を行う

ワンライナーやる時かシェル芸でしか使わないような気もしますが。


例えば、今回のシェル芸勉強会(第7回・ゆるふわ)の問題7の模範解答①を少し書き換えて、cpコマンドをechoするように書くと

$ find . -type file | sed 's;./;;' | while read f; do echo cp $f $(echo $f | sed 's;/;_;g'); done

cp a/001 a_001
cp a/002 a_002
cp b/c/123 b_c_123
cp b/xxx b_xxx
cp b/yyy b_yyy

となります。
このwhileのところをxargsで置き換えると

$ find . -type file | sed 's;./;;' | xargs -I% bash -c 'echo cp % $(echo % | sed "s;/;_;g")'

cp a/001 a_001
cp a/002 a_002
cp b/c/123 b_c_123
cp b/xxx b_xxx
cp b/yyy b_yyy

と宣言的?に書くことが出来ます。


※Note:実験用tree作成は

$ mkdir -p a b b/c
$ touch a/001 a/002 b/xxx b/yyy b/c/123