使用と仮定chmod
からのGNU coreutilsのパッケージのUbuntu 12.10上を。
chmod 775 . -R
fchmodat
許可の変更が必要かどうかに関係なく、見つかったファイルごとにシステムコールを実行します。これを確認するには、コードを調べstrace chmod 775 . -R
、実際の動作をリストするために(以下のスニペット)を使用します。
newfstatat(4, "d", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "d", 0775) = 0
newfstatat(4, "c", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "c", 0775) = 0
newfstatat(4, "a", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "a", 0775) = 0
newfstatat(4, "b", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "b", 0775) = 0
fchmodat
各ファイルで実行することにはいくつかの欠点があります
- 多数のファイルが変更された場合、余分なシステムコールが重要になる可能性があります。
find
/ xargs
/ chmod
他の人が言及した方法は、おそらく唯一の変更が必要なファイルを変更することにより、迅速になります。
- の呼び出し
fchmodat
は、各ファイルのファイル状態の変更(ctime)を変更します。これにより、すべてのファイル/ inodeが毎回変更され、過剰なディスク書き込みが発生する可能性があります。マウントオプションを使用して、これらの過剰な書き込みを停止することができます。
単純な実験では、ctimeの変化がストレートで発生していることが示されています chmod
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 d
auser@duncow:/tmp/blah.test$ chmod 775 . -R
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d
しかし、これはfind
/ xargs
/ chmod
数分後には変わりません
auser@duncow:/tmp/blah.test$ date
Tue Jun 18 18:27:27 BST 2013
auser@duncow:/tmp/blah.test$ find . ! -perm 775 -print0 | xargs -0 -I {} chmod 775 {}
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d
find では、物の選択をより細かく制御できるため、常にfind
/ xargs
/ chmod
バージョンを使用する傾向があります。