xargsでもパイプとかif文とか使いたい

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