Якщо припустити , що використання 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оскільки пошук дає більше контролю над вибором речей.