Angenommen, Sie verwenden chmod
das GNU-Paket coreutils unter Ubuntu 12.10.
chmod 775 . -R
führt den fchmodat
Systemaufruf für jede gefundene Datei aus, unabhängig davon, ob die Berechtigungen geändert werden müssen oder nicht. Ich bestätigte dies, indem ich den Code strace chmod 775 . -R
überprüfte und (Ausschnitt unten) verwendete, um das tatsächliche Verhalten aufzulisten.
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
Die Ausführung fchmodat
jeder Datei hat einige Nachteile
- Der zusätzliche Systemaufruf wird wahrscheinlich erheblich, wenn eine große Anzahl von Dateien geändert wird. Die
find
/ xargs
/ chmod
Methode von anderen erwähnt wird wahrscheinlich schneller sein , indem nur Dateien zu ändern , die geändert werden müssen.
- Der Aufruf zum
fchmodat
Ändern der Dateistatusänderung (ctime) jeder Datei. Dies führt dazu, dass sich jede Datei / jeder Inode jedes Mal ändert und wahrscheinlich zu einem Überschuss an Schreibzugriffen auf die Festplatte führt. Möglicherweise können Mount-Optionen verwendet werden, um diese überschüssigen Schreibvorgänge zu stoppen.
Ein einfaches Experiment zeigt die zeitlichen Änderungen, die gerade stattfinden 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
Aber das ändert sich nicht für find
/ xargs
/ chmod
ein paar Minuten später
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
Ich würde immer dazu neigen , die verwenden find
/ xargs
/ chmod
Version , da find mehr Kontrolle über die Auswahl Dinge gibt.