Якщо припустити , що використання 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 кожного разу і, ймовірно, призведе до надмірного запису на диску. Можливо, можна використовувати параметри кріплення, щоб зупинити ці надлишкові записи.
Простий експеримент показує зміни часу, що відбуваються для прямої 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
/ xargs
/, chmod
оскільки пошук дає більше контролю над вибором речей.