En supposant l'utilisation de chmod
du paquet GNU coreutils sur Ubuntu 12.10.
chmod 775 . -R
exécute l' fchmodat
appel système pour chaque fichier qu'il trouve, que les autorisations doivent ou non être modifiées. J'ai confirmé cela en inspectant le code et en utilisant strace chmod 775 . -R
(extrait ci-dessous) pour répertorier le comportement réel.
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
Il y a quelques inconvénients à s'exécuter fchmodat
sur chaque fichier
- L'appel système supplémentaire deviendra probablement important si un grand nombre de fichiers sont modifiés. La méthode
find
/ xargs
/ chmod
mentionnée par d'autres sera probablement plus rapide en ne modifiant que les fichiers qui doivent être modifiés.
- L'appel à
fchmodat
change la modification de l'état du fichier (ctime) de chaque fichier. Cela entraînera la modification de chaque fichier / inode à chaque fois et entraînera probablement un nombre excessif d'écritures sur disque. Il peut être possible d'utiliser des options de montage pour arrêter ces écritures excessives.
Une expérience simple montre les changements de temps qui se produisent pour les droites 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
Mais cela ne change pas pendant find
/ xargs
/ chmod
quelques minutes plus tard
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
J'aurais toujours tendance à utiliser la version find
/ xargs
/ chmod
parce que find donne plus de contrôle sur la sélection des choses.