Suponiendo que el uso de chmod
Del paquete GNU coreutils en Ubuntu 12.10.
chmod 775 . -R
ejecuta la fchmodat
llamada del sistema para cada archivo que encuentra, independientemente de si los permisos deben cambiarse o no. Confirmé esto inspeccionando el código y usando strace chmod 775 . -R
(fragmento a continuación) para enumerar el comportamiento real.
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
Hay un par de desventajas de ejecutar fchmodat
en cada archivo
- La llamada adicional al sistema probablemente se volverá significativa si se cambia una gran cantidad de archivos. El método
find
/ xargs
/ chmod
mencionado por otros probablemente será más rápido al cambiar solo los archivos que deben cambiarse.
- La llamada a
fchmodat
cambia la modificación del estado del archivo (ctime) de cada archivo. Esto hará que cada archivo / inodo cambie cada vez y probablemente causará un exceso de escritura en el disco. Es posible utilizar las opciones de montaje para detener estas escrituras en exceso.
Un experimento simple muestra los cambios de ctime que ocurren para 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
Pero esto no cambia durante find
/ xargs
/ chmod
unos minutos más tarde
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
Siempre tendería a usar la versión find
/ xargs
/ chmod
porque find brinda más control sobre la selección de cosas.