ablog

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

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

xargs とは

標準入力から渡されたファイル名などを引数とみなして、別のコマンドの引数として起動するというものです。

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

というものらしい。
言葉だけではピンとこないので具体例で言うと、

% find . -type f | while read line
do
	chmod g+w $line
done

と同じことを xargs を使うと、

find . -type f | xargs chmod g+w

でできる。


[使用例]

% mkdir -p {a,b,c}/{1,2,3}
% find . | xargs -I{} touch {}/hoge.txt
% find . -type f | xargs ls -l
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./a/1/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./a/2/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./a/3/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./a/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./b/1/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./b/2/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./b/3/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./b/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./c/1/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./c/2/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./c/3/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./c/hoge.txt
-rw-r--r--   1 oracle   oinstall       0 Aug 25 17:53 ./hoge.txt
% find . -type f | xargs chmod g+w
% find . -type f | xargs ls -l
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./a/1/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./a/2/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./a/3/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./a/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./b/1/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./b/2/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./b/3/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./b/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./c/1/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./c/2/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./c/3/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./c/hoge.txt
-rw-rw-r--   1 oracle   oinstall       0 Aug 25 17:53 ./hoge.txt
% find . -type f | xargs rm
% find .
.
./a
./a/1
./a/2
./a/3
./b
./b/1
./b/2
./b/3
./c
./c/1
./c/2
./c/3


[補足]

find . -type f -print0 | xargs -0 chmod g+w

のように find に -print0、xargs に -0 をつけないとスペースを含んだパスを扱えないらしいが、Solaris10 にはこれらのオプションがなかったので上の例ではつけていない。


[参考]
404 Blog Not Found:perl - the best friend of find(1)
http://openlab.dino.co.jp/2008/02/20/133431188.html
void GraphicWizardsLair( void ); // いまどきfindとxargsを使う時は-print0と-0を忘れずに
http://mr-goofy.blogspot.com/2009/05/xargs.html