cp против cp -r в символических ссылках

cp против cp -r в символических ссылках

Недавно я экспериментировал с командой 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.

Связанный контент