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

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

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

что делать?

5
задан Der Hochstapler
28.01.2023 18:35 Количество просмотров материала 3560
Распечатать страницу

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 2023-01-30 02:23

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

34
отвечен Ignacio Vazquez-Abrams 2023-01-30 04:40

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

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

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

26
отвечен mrucci 2023-01-30 06:57

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

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_ 2023-01-30 09:14

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

cp -Prv /sourcer_dir/* /target_dir
9
отвечен oarevalo 2023-01-30 11:31

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

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

использовать 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 - )'

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

8
отвечен quack quixote 2023-01-30 13:48

попробовать: 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
отвечен ebe0 2023-01-30 16:05

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

cp --no-dereference --preserve=links
1
отвечен Amiramix 2023-01-30 18:22

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 2023-01-30 20:39

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх