Supponendo che l'uso di chmod
dal pacchetto coreutils GNU su Ubuntu 12.10.
chmod 775 . -R
esegue la fchmodat
chiamata di sistema per ciascun file trovato indipendentemente dal fatto che le autorizzazioni debbano essere modificate o meno. L'ho confermato sia ispezionando il codice che utilizzando strace chmod 775 . -R
(frammento di seguito) per elencare il comportamento effettivo.
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
Ci sono un paio di svantaggi nell'esecuzione fchmodat
su ogni file
- La chiamata di sistema aggiuntiva diventerà probabilmente significativa se viene modificato un numero elevato di file. Il metodo
find
/ xargs
/ chmod
menzionato da altri sarà probabilmente più veloce cambiando solo i file che devono essere modificati.
- La chiamata per
fchmodat
modificare la modifica dello stato del file (ctime) di ciascun file. Ciò farà cambiare ogni file / inode ogni volta e probabilmente causerà scritture in eccesso del disco. Potrebbe essere possibile utilizzare le opzioni di montaggio per interrompere queste scritture in eccesso.
Un semplice esperimento mostra i cambiamenti di ctime in corso per straight 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
Ma questo non cambia per find
/ xargs
/ chmod
pochi minuti dopo
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
Tenderei sempre ad usare la versione find
/ xargs
/ chmod
perché find dà più controllo sulla selezione delle cose.