findを使った再帰的なファイル属性変更
CD-Rなどの読み出し専用のメディアからコピーしたファイルや,FreeBSDとは異なる処理系で作成されたもので実行属性がついてしまっているファイルの属性を変更したい場合があります.こうした場合はchmod
を利用することになるのですが,数が多い場合やディレクトリの階層が深い場合,作業に一考を要することになります.典型的には以下の要望がchmod
への再帰オプション-R
では解決できないためです.
- ディレクトリに与える属性は
755
- ファイルに与える属性は
644
この場合,find
とxargs
を利用することになります.find
は-type
引数によって列挙するファイルの種類を指定できるからです.したがって,あるディレクトリtargetdir
を再帰的に探索し,下位の階層にあるディレクトリとファイルにそれぞれ755
,644
なる属性を与えるには以下のようにします.
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
に与えるためです.find
とxargs
それぞれに与えている-print0
と-0
引数は空白類をエスケープするためのものです.著者個人は空白類をファイル名に含めることはないのですが,他者から提供を受けたデータ類にはそういったものもあるためです.
ちなみに,find
の引数には有用なものが多くあり,単純な内容であれば-exec
引数によって直接的に何らかの操作を行うことも可能です.また,ファイルの削除程度であれば専用の引数が用意されています.例えばディレクトリtargetdir
を再帰的に探索して*~
なるファイル名を持つものを削除するには以下のようにします.
find /path/to/targetdir -type f -name "*~" -print -delete