Если предположить , что использование 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) каждого файла. Это приведет к тому, что каждый файл / индекс будет меняться каждый раз и, вероятно, приведет к избыточной записи на диск. Может быть возможно использовать параметры монтирования, чтобы остановить эти лишние записи.
Простой эксперимент показывает изменения ctime, происходящие для прямой 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
версию, потому что поиск дает больше контроля над выбором вещей.