Как скопировать символьные ссылки?

У меня есть каталог, который содержит некоторые символьные ссылки:

user@host:include$ find .. -type l -ls
4737414    0 lrwxrwxrwx   1 user group       13 Dec  9 13:47 ../k0607-lsi6/camac -> ../../include
4737415    0 lrwxrwxrwx   1 user group       14 Dec  9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417    0 lrwxrwxrwx   1 user group       12 Dec  9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420    0 lrwxrwxrwx   1 user group       19 Dec  9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat

Я должен скопировать их в текущий каталог. Получающиеся каналы должны быть независимы от своих прототипов и привести непосредственно к своим целевым объектам.

  • cp -s создает ссылки на ссылки, который не является соответствующим поведением.
  • cp -s -L отказывается копировать ссылки на каталоги
  • cp -s -L -r отказывается копировать относительные ссылки на нерабочий каталог

Что мне делать?

184
задан 08.07.2015, 18:14

4 ответа

cp --preserve=links

Из страницы справочника:

   --preserve[=ATTR_LIST]
          preserve  the   specified   attributes   (default:   mode,owner-
          ship,timestamps),  if  possible  additional attributes: context,
          links, xattr, all

Лично, я использую cp -av для большей части моего тяжелого копирования. Тем путем я могу сохранить все - даже рекурсивно - и видеть вывод. Конечно, это - просто персональное предпочтение.

Относительно того, почему Ваши другие опции не сделали то, что Вы ожидали, -s делает ссылку вместо того, чтобы копировать и -L переходит по ссылкам в источнике, чтобы найти, что файл копирует вместо того, чтобы копировать сами ссылки.

206
ответ дан 07.12.2019, 07:41

Если ссылки будут содержать относительные пути, то, копируя ссылку не скорректирует относительный путь. Использовать readlink, с переключателем -f следовать рекурсивно, для получения полного пути ссылки. Например:

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink

Если сохранение относительных путей - то, что Вы хотите, чем опция -P из cp, как сказано Ignacio Vazquez-Abrams, то, в чем Вы нуждаетесь.

30
ответ дан 07.12.2019, 07:41

Как в странице справочника говорится, использовать -P.

46
ответ дан 07.12.2019, 07:41

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

Это - излишество для копирования всего нескольких символьных ссылок, но если Вы на самом деле пытаетесь скопировать все дерево, это может быть очень полезно:

Используйте tar.

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

tar не разрешает символьную ссылку по умолчанию, таким образом, символьные ссылки в зеркальной копии укажут на те же местоположения как те, которые в исходном дереве.

Этот прием использует подоболочки, чтобы заставить команду tar в положение в корне каталога быть зеркально отраженной; можно пропустить одного из них (наряду со связанной командой CD), если Вы уже находитесь в src или dest каталогах:

# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

# just need src/foo?
# this result will be a mirror copy at dest/foo 
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )

# mirror to another system?
user@host:/src$ tar cf - . | ssh user@example.com '( cd /path/to/dest ; tar xf - )'

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

11
ответ дан 07.12.2019, 07:41

Теги

Похожие вопросы