xargsは、標準入力から渡されたファイル名などを引数とみなして別のコマンドの引数として起動します。
使い方によっては、とても便利なコマンドなんです。
いくつか使用例を紹介します。
【便利な使い方1.chmodコマンドで大量ファイルのアクセス権を変更する場合】
findで見つけたファイルのアクセス権を変更したい場合findコマンドとchmodコマンドを組み合わせて変更することができます。
$ chmod 666 `find . -name "*.jpg"` ←バッククォーテーションでかこってね
このように処理をすると、カレントディレクトリ以下にある、何とか.jpg」ってファイルを検索し、アクセス権を666に変更します。
ただ、この方法だとファイルの数が多すぎる場合、うまく処理がおこなえなえず、エラーが出てしまうことがあります。
$ bash: /bin/chmod: Argument list too long ←こんなエラーとか
$ -bash: /bin/chmod: 引数リストが長すぎます ←こんな感じのエラー
このような場合に、xargsコマンドを使用すると問題を解決することができます。
$ find . -name "*.jpg" | xargs chmod 666
しかし、この方法でもうまくいかない場合があります。例えば、ファイル名にスペースが入っている場合です。
なぜスペースが入っているとうまくいかないのかというと、xorgsコマンドはスペースやタブ、改行が入っていた場合、区切り文字となってしまい複数のファイルに分割されてしまいます。
具体的に例として挙げるとすると「./Hello omiya」というファイルがあったとします。
xorgsコマンドにの認識は「./Hello」と「omiya」になってしまい、うまく処理がおこなえません。
そんな時は、findコマンドに「-print0」オプションを使用することにより、問題を解決することができます。
「-print0」オプションを使用すると、区切り文字がスペースから「\0(バックスペース+ゼロ)」に変更されます。
さらに、xargsコマンドは、「-0」オプションを使用した場合「\0」を区切り文字として扱います。
$ find . -name "*.jpg" -print0 | xargs -0 chmod 666
【便利な使い方2.mvコマンドとの組み合わせ】
「mv」コマンドの場合、引数に移動先のディレクトリを指定する必要があるので、xargsコマンドが使えなさそうな感じがするのですが、実は使用することができます。
$ find . -name "*.jpg" -print0 | xargs -0 mv -t /tmp
mvコマンドに、「-t」オプションと組み合わせることによって使用することができます。
「-t」オプションは、xargsコマンドと組み合わせて使うためのオプションとなります。
【便利な使い方3.rmコマンドとの組み合わせ】
こんな感じで組み合わせると、大量のファイルも一括で削除できます。
$ find . -name "*.jpg" -print0 | xargs -0 rm -f