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

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

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

что делать?

156
задан Der Hochstapler 2010-05-07 08:36:38
источник

9 ответов

cp --preserve=links

со страницы man:

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

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

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

174
отвечен kainosnous 2011-07-27 17:30:44
источник

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

34
отвечен Ignacio Vazquez-Abrams 2010-05-07 08:39:24
источник

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

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

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

26
отвечен mrucci 2012-07-27 12:53:12
источник

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

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
19
отвечен Juh_ 2016-09-08 19:17:21
источник

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

cp -Prv /sourcer_dir/* /target_dir
9
отвечен oarevalo 2012-05-15 21:25:32
источник

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

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

использовать tar.

[email protected]:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

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

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

# already in src?
[email protected]:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
[email protected]:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

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

# mirror to another system?
[email protected]:/src$ tar cf - . | ssh [email protected] '( cd /path/to/dest ; tar xf - )'

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

8
отвечен quack quixote 2010-05-07 10:03:32
источник

попробовать: cp-pr пунктом симлинк

[[email protected] 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
[[email protected] temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[[email protected] 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
[[email protected] temp]# 

OS-Centos 5 (Linux)

3
отвечен ebe0 2011-07-27 17:15:51
источник

в Ubuntu при копировании ссылок и файлов в директорию:

cp --no-dereference --preserve=links
1
отвечен Amiramix 2015-12-01 15:51:43
источник

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

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

  • СР-ов реж/* Н/ создает символическую ссылку, а не копировать, н/д->../DIR /a (ссылка) и N/b ->(../Реж/б) ссылка на ссылка
  • ср -л реж/* Н/ копии с разыменование ссылки, н/д, н/б (так же как dir/а)

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

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

refer man cp или cp --help дополнительные параметры.

0
отвечен Atif Hussain 2018-06-26 06:24:57
источник

Другие вопросы linux command-line symbolic-link cp

X