xargsのオプションって環境によるのね

-execもxargsも、rmを何度も実行するが、perlにパイプする例では、findとperlしか実行されないので高速かつ負荷が低い。

404 Blog Not Found:勝手に添削 - find(1)

コメントでも指摘されてるけど、確かrmが何度も実行されるのはオプションをつけた時だよなぁ、とちょっと気になったので手持ちの環境でxargsの動作を調査。

Mac OS Xの場合

$ ls -1 | xargs echo
Desktop Documents Library Movies Music Pictures Public Sites

$ ls -1 | xargs -l echo
xargs: illegal option -- l

$ ls -1 | xargs -l2 echo
xargs: illegal option -- l

$ ls -1 | xargs -L 1 echo
Desktop
Documents
Library
Movies
Music
Pictures
Public
Sites

$ ls -1 | xargs -L 2 echo
Desktop Documents
Library Movies
Music Pictures
Public Sites

Fedoraの場合

$ ls -1 | xargs echo
bin etc games include lib libexec sbin share src 

$ ls -1 | xargs -l echo
bin
etc
games
include
lib
libexec
sbin
share
src

$ ls -1 | xargs -l2 echo
bin etc
games include
lib libexec
sbin share
src

$ ls -1 | xargs -L 1 echo
bin
etc
games
include
lib
libexec
sbin
share
src

Debianの場合

$ ls -1 | xargs echo
bin games include lib man sbin share src

$ ls -1 | xargs -l echo
bin
games
include
lib
man
sbin
share
src

$ ls -1 | xargs -l2 echo
bin games
include lib
man sbin
share src

$ ls -1 | xargs -L 1 echo
xargs: invalid option -- L

まとめると

  • xargsにオプション指定なしだと、入力した各行をjoinした結果をコマンドに渡す
  • 上記のjoin処理を行わない場合、-l(Debian)あるいは-L(Mac)オプションを指定
  • Fedoraは-lも-Lも受け付ける

つい最近、joinされることを知らなくてはまったばかりだったりする^^;

joinする行数を指定できるのは、このエントリー書くために調べて初めて知った。