findコマンドでカレントディレクトリを除外する
findでカレントディレクトリを除外せず大失敗
foo ├── bar │ └── two.txt ├── baz │ └── three.txt └── one.txt
こういう階層構造で
- fooの所有権をroot:root
- fooの中のディレクトリの所有権をwww:www
- ファイルの所有権は変えない
に変更しようとして以下の通り作業して大失敗。
$ sudo chown root:root foo $ cd foo $ find . -type d -exec sudo chown www:www "{}" ¥;
これをやってしまうとfindの結果に'.'が含まれて、fooもwww:wwwに所有権変更されてしまった!
試しにfindだけやってみると
. ./bar ./baz
この通りカレントディレクトリがヒットする。
これ、実は本番環境でwebサーバーからファイルサーバーのファイルを配信するときにwwwユーザーに権限が無くてファイルが参照できないというトラブル対応の最中にやらかして結構焦った。
findのandとnotでカレントディレクトリを除外
他にうまいやり方があるのかもしれないけど、とりあえずfindの-a(and)と!(not)を使って対処。
$ sudo chown root:root foo $ cd foo $ find . -type d -a ! -name '.' -exec sudo chown www:www "{}" ¥;