ハバナ式継続的デリバリー

Python, Ubuntu, JavaScript 色々知らなかった!のメモ

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 "{}" ¥;