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


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

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 отказывается копировать относительные ссылки на нерабочий каталог

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


147
2018-05-07 04:36


происхождения


cp -d сделал работу на моей стороне. - m-ric
cp -R на mac - Mirko


ответы:


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 следует ссылки в источнике, чтобы найти файл для копирования вместо копирования самих ссылок.


167
2018-05-07 05:02



Возможно, вам придется добавить -R, поскольку в противном случае cp будет пропускать каталоги и символические ссылки в каталоги. - Olivier 'Ölbaum' Scherler
Я пробовал это на redhat, и он не работает - Mansuro
на Mac? использование cp -a - Steve Tauber
+1 для -a вариант. Хех, я искал варианты в cpв manpage страниц, но я всегда должен был пересмотреть это. Я до сих пор использую -dpr, но -a охватывает все те, плюс сохранение нескольких других атрибутов. Если бы мне понадобились эти другие атрибуты, я бы, вероятно, посмотрел --preserve снова использовать и использовать -dr --preserve=all, что и есть то, что -a является! Ну, по крайней мере, я знаю сейчас - -a это то, что я буду использовать с этого момента. - James Haigh
Это не сработало на Cygwin. --preserve=links было недостаточно. Он все еще сказал cp: omitting directory, Но -av работал. - Chloe


Так же, как говорится в справочной странице, используйте -P,


32
2018-05-07 04:39



на Mac -P не работает в каталогах, поэтому я использовал cp -a - Steve Tauber
Спасибо, я видел и получал от вашего ответа 3 раза больше раз в год. Кажется, не помню! - Siddhartha
Это работает, но на моей странице man говорится: «-P никогда не следует символическим ссылкам в SOURCE», который не является интуитивно таким же, как «копировать символические ссылки как символические ссылки в пункт назначения». («никогда не следует», похоже, что он работает в комбинации с -R) - R.M.
Эта cp -P в отличие от верхнего голосового ответа от @kainosnous работает для меня. Благодаря! - tommy.carstensen
Работает над Redhat. Принятый ответ не работает! - Phiber


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

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

Если сохранение относительных путей - это то, что вы хотите, чем вариант -P из cp, как сказал Игнасио Васкес-Абрамс, это то, что вам нужно.


26
2018-05-07 05:09



Может быть, плохая идея разыгрывать рекурсивно, если все, что вы пытаетесь сделать, - это преобразовать символические ссылки из относительного абсолютного. Рекурсия здесь не нужна, и иногда цепочки символических ссылок существуют по какой-то причине. Символы часто используются для указания вариантов или параметров конфигурации. Например, в моей системе есть цепочка символических ссылок /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english который указывает предпочтительный словарь. Если бы вы рекурсивно разыменовали эту цепочку, итоговая символическая ссылка проигнорировала бы любые будущие изменения этого предпочтения. - James Haigh


Некоторые из них прокомментировали:

cp -a 

работает хорошо.

От человека:

-a    same as -dR --preserve=all

-R    copy directories recursively
-d    same as --no-dereference --preserve=links
--no-dereference   never follow symbolic links in SOURCE

16
2018-01-27 14:51



... но только если ни одна из символических ссылок не относится к относительным путям. - Michael Scheper


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

cp -Prv /sourcer_dir/* /target_dir

9
2018-05-15 17:25





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

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

использование деготь,

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

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

Этот трюк использует подоболочки для получения деготь команду в позицию в корне директории, подлежащей зеркалированию; вы можете оставить один из них (вместе с CD команда), если вы уже находитесь в ЦСИ или 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 - )'

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


8
2018-05-07 06:03



tar, безусловно, более переносимый, чем cp в моем опыте - don bright


Пытаться: cp -pr назначение символической ссылки

[root@station1 temp]# ls -l
total 8
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
[root@station1 temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[root@station1 temp]# ls -l
total 12
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
lrwxrwxrwx 1 root root 13 Jul 27 18:42 abc.link2 -> /tmp/temp/abc
[root@station1 temp]# 

OS - Centos 5 (Linux)


3
2017-07-27 13:15