Утилиты chown
и chmod
выполняют фактическую запись в файл, когда настройки, которые им было поручено установить, уже имеют какой файл? Например:
> ls -l
... gooduser gods ... state_secrets
> chown gooduser:gods state_secrets
Должен ли я использовать find
для поиска файлов, требующих изменений, или просто chmod -R
будет более эффективным?
Хороший способ выяснить, действительно ли 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 …
).