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とかでも行けるはずなので、かなり高度なことが出来るかもしれません? …まあ、高度なことをシェルでやろうとするなという気もしますが。