6

Моя ОС сообщает следующее на странице man cp:

   -H     follow command-line symbolic links

   -L, --dereference
          always follow symbolic links

Мне трудно понять, что такое "символическая ссылка командной строки ".

2 ответа2

12

Нет такой вещи как символическая ссылка командной строки. Страница man ссылается на ссылки, которые появляются в командной строке, т. Е. Как аргументы команды cp .

Без ключа -R поведение cp -H и cp -L идентично.

С ключом -R cp -H разыменовывает только символические ссылки, которые встречаются в самой команде cp , тогда как -L также разыменовывает символические ссылки внутри рекурсивно скопированных каталогов.

Команда

cp -R -H source/ dest/

скопирует источник каталога и все его содержимое в каталог dest. Если источник является символической ссылкой на каталог, cp будет разыменовывать символическую ссылку, то есть копировать источник каталога, на который указывает источник. Однако, если ф встречает любые символические ссылки в подкаталогах исходных «s, она будет создавать символические ссылки в папке назначения.

Команда

cp -R -L source/ dest/

ведет себя аналогично. Тем не менее, он также будет разыменовать симлинками в подкаталогах исходных «s, т.е. скопировать файлы эти символические ссылки указывают.

1

Опция -H для cp изменяет поведение -R (рекурсивное копирование) следующим образом:

Если -H не передается, а исходный путь, указанный в командной строке, является символической ссылкой на каталог, то ссылка будет скопирована в целевой путь.

Если -H передается, и путь к источнику и пр., И пр., То ссылка будет разыменовываются и ссылки каталог рекурсивно копируются в путь назначения.

Это не очень помогает, я думаю; возможно, пример прояснит это лучше. (В ls -pF завершающий / указывает каталог, а завершающий @ обозначает символическую ссылку.)

1  me@box tmp $ for dir in foo bar; do mkdir $dir; done
2  me@box tmp $ ls -pF
bar/ foo/
3  me@box tmp $ touch foo/file
4  me@box tmp $ ln -s foo baz
5  me@box tmp $ ls -pF
bar/ baz@ foo/
6  me@box tmp $ cp -R baz bar
7  me@box tmp $ ls -pF bar
baz@
8  me@box tmp $ unlink bar/baz
9  me@box tmp $ cp -HR baz bar
10 me@box tmp $ ls -pFR bar
bar:
baz/

bar/baz:
file
11 me@box tmp $

Видишь, как это работает? В строке 6 я ввел cp -R без опции -H , и символическая ссылка baz была скопирована в bar/ . Затем в строке 9 я выдал cp -HR и разыменовал cp baz и рекурсивно скопировал его содержимое (то есть содержимое foo/ , как показано в строке 4) в bar/ .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .