findを使った再帰的なファイル属性変更

CD-Rなどの読み出し専用のメディアからコピーしたファイルや,FreeBSDとは異なる処理系で作成されたもので実行属性がついてしまっているファイルの属性を変更したい場合があります.こうした場合はchmodを利用することになるのですが,数が多い場合やディレクトリの階層が深い場合,作業に一考を要することになります.典型的には以下の要望がchmodへの再帰オプション-Rでは解決できないためです.

  • ディレクトリに与える属性は755
  • ファイルに与える属性は644

この場合,findxargsを利用することになります.find-type引数によって列挙するファイルの種類を指定できるからです.したがって,あるディレクトtargetdir再帰的に探索し,下位の階層にあるディレクトリとファイルにそれぞれ755644なる属性を与えるには以下のようにします.

find /path/to/targetdir -type f -print0 | xargs -n 100 -0 chmod 644
find /path/to/targetdir -type d -print0 | xargs -n 100 -0 chmod 755

xargsを使っているのはfindが列挙したファイル名が多すぎる場合にこれを適当な(ここでは100)に分割してchmodに与えるためです.findxargsそれぞれに与えている-print0-0引数は空白類をエスケープするためのものです.著者個人は空白類をファイル名に含めることはないのですが,他者から提供を受けたデータ類にはそういったものもあるためです.

ちなみに,findの引数には有用なものが多くあり,単純な内容であれば-exec引数によって直接的に何らかの操作を行うことも可能です.また,ファイルの削除程度であれば専用の引数が用意されています.例えばディレクトtargetdir再帰的に探索して*~なるファイル名を持つものを削除するには以下のようにします.

find /path/to/targetdir -type f -name "*~" -print -delete