web-dev-qa-db-ja.com

再帰的に実行すると、chmodが「そのようなファイルやディレクトリはありません」と表示するのはなぜですか?

ファイルの権限を直接変更できます。

# chmod --changes --recursive ug+rwX       /var/www/shared/tmp/cache/assets/BA0/280/sprockets%2F286302903364106648b609d708884f78

また、ファイルを含むディレクトリの権限を変更することもできます。

# chmod --changes --recursive ug+rwX       /var/www/shared/tmp/cache/assets/BA0/280

そのディレクトリを含むディレクトリの権限を再帰的に変更しようとすると、前のディレクトリが見つからないというエラーが表示されます。

# chmod --changes --recursive ug+rwX       /var/www/shared/tmp/cache/assets/BA0
chmod: getting new attributes of `280': No such file or directory

現在のアクセス許可は、これがどのように影響するかはわかりませんが、次のようになります。

# ls -alR /var/www/shared/tmp/cache/assets/BA0
/var/www/shared/tmp/cache/assets/BA0:
total 20
drwxrwsr-x   3 Rails rails  4096 Jun  4 09:54 .
drwxrwsr-x 569 Rails rails 12288 Jun  4 09:54 ..
drwxrwsr-x   2 Rails rails  4096 Jun  4 09:54 280

/var/www/shared/tmp/cache/assets/BA0/280:
total 12
drwxrwsr-x 2 Rails rails 4096 Jun  4 09:54 .
drwxrwsr-x 3 Rails rails 4096 Jun  4 09:54 ..
-rw-rw-r-- 1 Rails rails  481 Jun  4 09:54 sprockets%2F286302903364106648b609d708884f78

Rootとしてコマンドを実行しています。イデア?

6
pupeno

このバグは関連しているようです:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=706097

Coreutils 8.13-3.5を使用して、debian 7でそれを再現できます。

「--changes」または「--verbose」を使用しないことで問題を回避できると思います。

3
LatinSuD

今週、--verbose。最初は戸惑いましたが、絞り込んだと思います。このonlyは、SETGIDビットが設定されている場合に発生します。

テスト設定:

$ mkdir --parent foo/bar

SetGIDがなければ、エラーは発生しません:

$ chmod --recursive --changes o-rwx foo
mode of ‘foo’ changed from 0775 (rwxrwxr-x) to 0770 (rwxrwx---)
mode of ‘foo/bar’ changed from 0775 (rwxrwxr-x) to 0770 (rwxrwx---)

SETGIDの場合、エラー:

$ chmod --recursive g+s foo
$ chmod --recursive --changes o-rwx foo
mode of ‘foo’ changed from 2775 (rwxrwsr-x) to 2770 (rwxrws---)
chmod: getting new attributes of ‘bar’: No such file or directory

回避策として、findを使用します。

$ find foo | xargs chmod --changes o-rwx
mode of ‘foo’ changed from 0775 (rwxrwxr-x) to 0770 (rwxrwx---)
mode of ‘foo/bar’ changed from 0775 (rwxrwxr-x) to 0770 (rwxrwx---)

お役に立てれば!

5