ablog

不器用で落着きのない技術者のメモ

xargs 速えぇ

xargs がめちゃ便利なのでメモっておく - ablog に、id:teramako さんから以下のツッコミを頂いた。

>% find . -type f | while read line
>do
> chmod g+w $line
>done
>と同じことを xargs を使うと、
>find . -type f | xargs chmod g+w
見た目は一緒ですが多少意味が異なるのでツッコミを。
read lineで行うとファイル一つ一つに対してchmodコマンドが実行されますが、xargsの場合はchmodコマンドの引数の対象が複数のファイルになります。
コマンドはシェルの内部コマンドでない場合、毎回プロセスのフォークがされて実行されるため、findで見つけるファイルが大量の場合、体感速度にまで影響が出るほどの違いが出ます。
どういうことかは、
find . -type f | xargs echo
find . -type f | xargs -n 1 echo
find . -type f | xargs -n 2 echo
等をやってみると分かり易いのではないかと思います。

xargs がめちゃ便利なのでメモっておく - ablog

そこで気になったのが、

xargsの場合はchmodコマンドの引数の対象が複数のファイルになります。

というところ。
よくある「引数が多すぎます」ってエラーにならないんだろうか?

昨日、参考にしたブログを再度見てみた。

xargsを使った場合に上の2つの例とどう違うかというと、コマンド実行時の引数の制限を気にしつつ、rmにギリギリの個数のファイル名を渡して、必要最低限の回数だけ実行してくれます。100000ファイル一気にはrmできない場合でも、例えば25000ファイルづつに分けて4回rmしてくれます。安心かつ最速というわけで、xargsは便利ですよね!

http://openlab.dino.co.jp/2008/02/20/133431188.html

xargs かしこい & 速えぇんだ。


理解が深まりました。id:teramako さんありがとうございました。