Генерирует ли chown или chmod запрос на запись, когда им не нужно ничего менять?

Утилиты chown и chmod выполняют фактическую запись в файл, когда настройки, которые им было поручено установить, уже имеют какой файл? Например:

> ls -l 

... gooduser gods ... state_secrets

> chown gooduser:gods state_secrets

Должен ли я использовать find для поиска файлов, требующих изменений, или просто chmod -R будет более эффективным?

0
задан 16 June 2019 в 09:20

1 ответ

Хороший способ выяснить, действительно ли chown меняет владельца файлов, даже если они остаются неизменными (например, от pduck до pduck), - это запустить команду в strace. Таким образом, мы можем видеть API, которые на самом деле вызывают.

Я создал тестовый файл, который принадлежит мне и моей группе. Затем я сделал chown pduck:pduck test.txt, но с strace добавили:

$ touch test.txt
$ ls -l
total 0
-rw-r--r-- 1 pduck pduck 0 Jun 16 12:10 test.txt

$ strace chown pduck:pduck test.txt
execve("/bin/chown", ["chown", "pduck:pduck", "test.txt"], 0x7ffd0309c990 /* 74 vars */) = 0
brk(NULL)                               = 0x5589645df000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...
newfstatat(AT_FDCWD, "test.txt", {st_mode=S_IFREG|0644, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchownat(AT_FDCWD, "test.txt", 1000, 1000, 0) = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Как мы видим, право собственности действительно безоговорочно изменилось с pduck: pduck на 1000: 1000 (которые являются числовые идентификаторы pduck: pduck).


У вас есть несколько вариантов:

  • chown --from=pduck:pduck pgoose:pgoose text.txt Изменит владельца только на pgoose:pgoose, если в данный момент это pduck:pduck. Файлы с другими владельцами остаются нетронутыми. Добавьте -R, чтобы внести изменения рекурсивно.

  • find . -type f -user pduck -group pduck -exec chown pgoose:pgoose {} + Это (рекурсивно) найдет все файлы, принадлежащие pduck: pduck, и только для них запустите chown pgoose:pgoose ….

  • find . -type f -not -\( -user pduck -or -group pduck -\) -exec chown pduck:pduck {} + Изменяет владельца файлов, которые не принадлежат пользователю pduck или группе pduck.

Пока у вас нет сотен тысяч файлов, я не думаю, что есть большая разница в производительности.

Когда я делаю chown -R ..., то обычно потому, что целый каталог имеет «неправильное» владение (например, на флэш-дисках). Но я обычно никогда не делаю chmod -R, потому что файлы и каталоги нуждаются в разных разрешениях, а x имеет для них другое значение. У нас здесь много вопросов о том, как исправить эту ужасную вещь. Вместо этого я делаю это двумя отдельными командами (find -type d … и find -type f …).

3
ответ дан 16 June 2019 в 09:20

Другие вопросы по тегам:

Похожие вопросы: