Findのexecオプションとxargsコマンドについて

はじめに


年が明けましたね。

せっかくの休みなので、今まで溜め込んだファイルの整理をすることにしました。

無駄なファイルが山ほどあって、検索からの削除を便利にしよう

そう思ったのが今回の発端です。

さて、やります。

ファイル検索といえば


findコマンドを使いますね。

execオプションやパイプとともにxargsコマンドを駆使して検索したファイルに対して処理をします。

今回の要件ファイル削除系だとこんな感じですね。

1
$find . -name "*.dummy" -exec rm {} \;

xargsを使う場合だと、こっちですね。

1
$find . -name "*.dummy" -print0 | xargs -0 -n1 rm

因みに、print0オプションを有効にすると区切り文字がスペースから \0 に変更されます。
ファイル名にスペースがあるかもしれない場合とかはつけておくことがよいと思います。

他にxargsの-0オプションも上記同様のものです。-n<数字>は1 コマンドラインにつき最大の数字分ずつ引数として使用するという意味になります。

execオプションでxargsと同様の処理


これをする場合は、+を使えばよいようです。

1
$find . -name "*.dummy" -exec rm {}+

これだけだと意味があるような、ないような^;;

findのdeleteオプション


OS依存になるようですが、findコマンドにはdeleteオプションがあるようです。
これを使えば、上記のようにコマンドの組み合わせをせずともファイル検索→ファイル削除も同時にできるようです。

1
$find . -name "*.dummy" -print0 -delete

検索と同時に削除なので、危険な感じがしますが、便利に使えると思います。

まとめ


大したことでもないですが、こんな感じですね

  • findとxargsを組み合わせる場合、find側はprint0オプション、xargs側は-0オプションを付けたほうが安全
  • findコマンドでxargsと同様のことがしたい場合、execオプションの末尾を;から+に変更する
  • 検索+削除の場合、findコマンドのdeleteオプションを使うと便利