Недавно я экспериментировал с командой cp и заметил следующее:
предположим, у нас есть папка foo
, содержащая файл bar
и символическую ссылку l-bar
:
foo
|-- bar
|-- lbar -> bar
При копировании lbar
с параметрами по умолчанию cp lbar copy-lbar
получаем
foo
|-- bar
|-- copy-lbar
|-- lbar -> bar
где copy-lbar
— обычный файл, содержащий исходное содержимое bar
. copy-lbar
никак не связан с bar
или lbar
. При использовании cp -r lbar copy-lbar-recursive
вместо этого мы получаем следующее:
foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar
Теперь, так же как lbar
, copy-lbar-recursive
представляет собой ссылку на исходный bar
файл.
Но почему -r, --recursive
опция cp
изменения способа копирования ссылок?
И help
оба manual
просто cp
помечают это как"копировать каталоги рекурсивно".
Что происходит внутри, что -r
оказывает иное влияние на символическую ссылку?
решение1
ПолныйДокументация GNU(но не страница руководства Debian, например) описывает поведение следующим образом
При копировании из символической ссылки cp обычно следует по ссылке только тогда, когда не копирует рекурсивно или когда используется
--link
( ). Это значение по умолчанию можно переопределить с помощью параметров ( ), , ( ), ( ) и .-l
--archive
-a
-d
--dereference
-L
--no-dereference
-P
-H
Он также пишет:
'
--recursive
' Копировать каталоги рекурсивно. По умолчанию не следовать символическим ссылкам в источнике, если только не используется вместе с опцией--link
(-l
) [...]
Использование -r для копирования символических ссылок или специальных файлов непереносимо. [...]
Кроме того, использование -R для копирования символических ссылок непереносимо, если только вы не укажете также -P, поскольку POSIX допускает реализации, которые по умолчанию разыменовывают символические ссылки.
Итак, отвечая на ваш вопрос напрямую, поведение такое, как описано, чтобы сохранить элемент совместимости поведения по умолчанию с POSIX.