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

289132
Basilevs

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

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

Что я должен делать?

159
`cp -d` сделал работу на моей стороне. m-ric 10 лет назад 6
`cp -R` на Mac Mirko 9 лет назад 1

9 ответов на вопрос

177
kainosnous
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

Возможно, вам понадобится добавить `-R`, потому что в противном случае cp пропустит каталоги и символические ссылки на каталоги. Olivier 'Ölbaum' Scherler 11 лет назад 3
Я попробовал это на Redhat, и это не работает Mansuro 11 лет назад 7
Как раз то, что мне нужно было скопировать между томами на Amazon Linux AMI. Отлично! notacouch 11 лет назад 0
на Mac? используйте `cp -a` Steve Tauber 11 лет назад 33
Свойства выглядят иначе. И в отличие от обычной ссылки (как я вижу в / usr / bin, например, java), я больше не вижу цель ссылки, когда открываю свойства с помощью файлов Ubuntu GNOME или Nautilus или того, чем я пользуюсь Crowie 10 лет назад 0
+1 для опции `-a`. Хех, я искал варианты в справочной странице `cp 'бесчисленное количество раз, но я, должно быть, всегда просматривал это. До сих пор я использовал `-dpr`, но` -a` охватывает все из них, плюс сохранение нескольких других атрибутов. Если бы мне понадобились эти другие атрибуты, я бы, вероятно, снова посмотрел опцию `--preserve` и использовал` -dr --preserve = all`, что и есть `-a`! Ну, по крайней мере, теперь я знаю - `-a` идеально, и это то, что я буду использовать с этого момента. James Haigh 10 лет назад 9
Это не сработало на Cygwin. `--preserve = links` было недостаточно. Там все еще сказано `cp: пропуск каталога`. Но `-av` работал. Chloe 9 лет назад 3
@JamesHaigh на моем mac, man cp говорит: «-a То же, что и параметры -pPR. Сохраняет структуру и атрибуты файлов, но не структуру каталогов». Это звучит довольно страшно, так как основной смысл копирования структуры папок не сохраняется. Что это значит, если не то, что он копирует квартиру? AnneTheAgile 8 лет назад 0
в Ubuntu 16.04 `--preserve = link` не работает. `cp -a` вместо этого, успешно. MarcusJuniusBrutus 7 лет назад 0
35
Ignacio Vazquez-Abrams

Как написано на странице руководства, используйте -P.

на Mac `-P` не работает с каталогами, поэтому я использовал` cp -a` Steve Tauber 11 лет назад 7
Спасибо, я видел и получил пользу от вашего ответа 3 раза, а теперь раз в год. Не могу вспомнить это! Siddhartha 10 лет назад 4
Это работает, но моя справочная страница говорит «-P никогда не переходите по символическим ссылкам в SOURCE», что интуитивно не то же самое, что «копировать символические ссылки как символические ссылки в пункт назначения». («никогда не следуй» звучит так, как будто работает в сочетании с -R) R.M. 8 лет назад 0
Этот `cp -P`, в отличие от ответа @kainosnous, пользующегося популярностью у меня, работает для меня. Спасибо! tommy.carstensen 7 лет назад 0
Работает на Redhat. Принятый ответ не работает! Phiber 7 лет назад 0
27
mrucci

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

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

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

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

Как некоторые прокомментировали:

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 
... но только если ни одна из символических ссылок не относится к относительным путям. Michael Scheper 8 лет назад 1
9
oarevalo

I used the following to duplicate a really large directory. All symbolic links were preserved, the copy was done recursively and I was able to have some visual feedback of the process:

cp -Prv /sourcer_dir/* /target_dir 
8
quack quixote

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

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

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

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 - )' 

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

по моему опыту, tar определенно более переносим, ​​чем cp don bright 7 лет назад 1
3
ebe0

Попробуйте: 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]#  

ОС - Centos 5 (Linux)

1
Amiramix

В Ubuntu при копировании ссылок и файлов в каталог:

cp --no-dereference --preserve=links 
`cp -d` является сокращением для этого hunse 8 лет назад 3
0
Atif Hussain

cp -s и cp -L - это специальные команды. По вашему требованию не используйте ничего.

Например, копирование каталога DIR, содержащего a и символическую ссылку b, указывающую на a.

  • cp -s DIR / * N / создает символическую ссылку вместо копирования, N / a -> ../ DIR / a (ссылка) и N / b -> (../ DIR / b), которая является ссылкой на ссылку
  • cp -L DIR / * N / копирует с разыменованием ссылки, N / a, N / b (аналогично DIR / a)

Вам нужно N / a (= DIR / a) и N / b -> ../ N / a; так что просто скопируйте без разыменования, используя опцию cp -P. Я считаю, что это также по умолчанию для cp.

  • -P без разыменования, сохранить ссылки
  • -d объединяет опцию -P с -p для сохранения = режим, владение, метки времени
  • -a объединяет опцию -d с -R для рекурсивного копирования каталогов

обратитесь man cpили cp --helpдля более вариантов.

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