У меня есть каталог, который содержит несколько символических ссылок:
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
отказывается копировать относительные ссылки в нерабочий каталог
Что я должен делать?
linux
command-line
symbolic-link
cp
Basilevs
источник
источник
cp -d
сделал работу на моей стороне.cp -R
на макеОтветы:
Со страницы руководства:
Лично я использую
cp -av
для большинства моих тяжелых копий. Таким образом, я могу сохранить все - даже рекурсивно - и посмотреть результат. Конечно, это всего лишь личные предпочтения.Что касается того, почему другие ваши варианты не сделали того, что вы ожидали, вместо копирования создайте
-s
ссылку и перейдите по ссылкам в источнике, чтобы найти файл для копирования вместо того, чтобы копировать сами ссылки.-L
источник
-R
, потому что в противном случае cp будет пропускать каталоги и символические ссылки на каталоги.cp -a
-a
опцию. Хех, я смотрел варианты вcp
man-странице бесчисленное количество раз, но я, должно быть, всегда просматривал эту страницу. Я до сих пор использовал-dpr
, но-a
охватывает все это, плюс сохранение нескольких других атрибутов. Если бы мне понадобились эти другие атрибуты, я бы, наверное,--preserve
снова посмотрел на эту опцию и использовал ее-dr --preserve=all
, что и-a
есть! Ну, по крайней мере, теперь я знаю --a
идеально, и это то, что я буду использовать с этого момента.--preserve=links
не было достаточно Это все еще сказаноcp: omitting directory
. Но-av
сработало.Как написано на странице руководства, используйте
-P
.источник
-P
не работает с каталогами, поэтому я использовалcp -a
cp -P
отличие от топового ответа @kainosnous, работает для меня. Спасибо!Если ссылки содержат относительные пути, то копирование ссылки не будет корректировать относительный путь. Используйте
readlink
, с переключателем,-f
чтобы следовать рекурсивно, чтобы получить абсолютный путь ссылки. Например:Если сохранение относительных путей является то , что вы хотите, чем вариант
-P
сcp
, как сказал Игнасио Васкес-Abrams, является то , что вам нужно.источник
/usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english
которой указывается предпочтительный словарь. Если бы вы рекурсивно разыменовали эту цепочку, полученная символическая ссылка проигнорировала бы любые будущие изменения этого предпочтения.Как некоторые прокомментировали:
работает хорошо.
От мужчины:
источник
Я использовал следующее, чтобы дублировать действительно большой каталог. Все символические ссылки были сохранены, копия была сделана рекурсивно, и я смог получить некоторую визуальную обратную связь с процессом:
источник
В большинстве случаев, когда мне нужно скопировать много символических ссылок, я на самом деле пытаюсь отразить дерево каталогов. Поэтому я хочу символические ссылки и все остальное.
Это избыточно для копирования всего нескольких символических ссылок, но если вы на самом деле пытаетесь скопировать целое дерево, это может быть очень полезно:
Используйте смолу .
tar не разрешает символическую ссылку по умолчанию, поэтому символические ссылки в зеркальной копии будут указывать на те же места, что и в исходном дереве.
Этот трюк использует подоболочки, чтобы получить команду tar в корне каталога, который нужно отразить; вы можете оставить один из них (вместе со связанной командой cd ), если вы уже находитесь в каталогах src или dest :
Опять же, это не подходит для каждого случая, когда вы хотите скопировать символические ссылки, но это очень полезный фрагмент кода.
источник
Попробуйте: cp -pr символическая ссылка назначения
ОС - Centos 5 (Linux)
источник
В Ubuntu при копировании ссылок и файлов в каталог:
источник
cp -d
это сокращение для этогоcp -a
иcp --preserve=links
другое, чем вопрос. Насколько я понимаю, это правильный ответ для любогоcp
, кто использует , хотя только с файлами (без каталогов), как в вопросе, не--no-dereference
будет иметь никакого эффекта.Используйте
-P
опцию, как писал Игнасио Васкес-Абрамс выше . То, что он не упомянул-P
, без эффекта не имеет-R
. Так что тебе нужно как минимумcp -RP
.(Сайт пока не позволяет мне комментировать, поэтому я разместил отдельный ответ.)
источник
cp -s и cp -L - это специальные команды. По вашему требованию не используйте ничего.
Например, копирование каталога DIR, содержащего a и символическую ссылку b, указывающую на a.
Вам нужно N / a (= DIR / a) и N / b -> ../ N / a; так что просто скопируйте без разыменования, используя опцию cp -P. Я считаю, что это также по умолчанию для cp.
обратитесь
man cp
илиcp --help
для большего количества вариантов.источник