BlankTar

about | blog | works | photo

xargsってとっても便利なコマンドなのですが、あんまり複雑なコマンドは実行出来無いんですよね。例えば以下のようなコマンド。
$ ls | xargs -I{} avconv -i {} {}.mp3 && rm {}
mp3に変換して、成功したらオリジナルのファイルを削除したかった、的な。
これを実際に実行すると、変換が全て終わってから{}ってファイルを削除しようとします。意味ねぇ。

if文とかを使おうとすると状況はもっと酷くて、そもそもifなんてコマンドは無いとか言われます。シェル組み込みだものね、しかたない。

こういうときどうしたら良いのかというと、とくにどうしようも無いらしいので、shコマンドあたりを使います。
$ ls | xargs -I{} sh -c 'avconv -i {} {}.mp3 && rm {}'
こんな感じ。&&を使いましたが、もちろんパイプとかリダイレクトとかもろもろも使えます。

これならif文とかも使える。
$ ls | xargs -I{} sh -c 'if [ "{}" != "test" ]; then echo "{} is not test"; fi'
便利。
まあ、このコマンドに意味があるかどうかはともかくとして。

shじゃなくてもzshとかでも行けるはずなので、かなり高度なことが出来るかもしれません? …まあ、高度なことをシェルでやろうとするなという気もしますが。

参考:Bash - xargsで複数コマンドを実行する - Qiita
< 夏休みの自由研究が半分終わった。 python/flaskでgoogleにOpenIDでログインしてみた。ライブラリ無しで。 >