Из руководства coreutils
2.10 Обход симлинков
Следующие опции изменяют то, как chown и chgrp обходят иерархию если также указана опция
--recursive
(-R
). Если указано более одной из следующих опций, вступает в силу только последняя. Эти опции определяют, будет ли обработка символической ссылки на каталог влечет за собой обработку только символической ссылки или всех файлов в иерархии, корнем которой является этот каталог.Эти опции не зависят от
--dereference
и--no-dereference
(-h
), которые определяют, следует ли изменять симлинк или его референт.
-H
Если указано--recursive
(-R
) и аргументом командной строки является символическая ссылка на каталог, перейдите по ней.
-L
При рекурсивном обходе обходить каждую символьную ссылку на каталог, которая встречается. которая встречается.
-P
Не обходить символические ссылки. Это значение по умолчанию, если ни один из из-H
,-L
или-P
.
В разделе "Эти опции не зависят от
--dereference
и --no-dereference
(-h
), которые управляют изменением симлинка или его референта", что делают "эти опции" и "--dereference
и --no-dereference
" соответственно, и чем они отличаются?
Описания для -H
и для -L
, как мне кажется, говорят об одном и том же. Чем отличаются эти два варианта?
Спасибо.
Флаг -h
(он же --no-dereference
) - хороший флаг для использования. Допустим, у нас такая установка:
$ ln -s /etc/passwd /tmp/foobar
$ sudo chown fred /tmp/foobar
Поскольку --dereference
используется по умолчанию, это фактически изменит /etc/passwd
... что, вероятно, не то, чего вы хотите :-) Флаг -h
заставит его вместо этого изменить владельца симлинка. Поэтому вам следует взять за привычку использовать -h
, особенно при рекурсивном изменении права собственности. Т.е. делайте chmod -hR
, а не chmod -R
.
Флаг -H
применяется только к симлинкам каталогов, которые вы перечислили в командной строке. Опция -L
применяется ко всем найденным симлинкам каталогов, включая те, которые находятся в подкаталогах во время рекурсивного chown
.