2010-05-07 04:36:38 +0000 2010-05-07 04:36:38 +0000
188
188

Jak skopiować symboliczne linki?

Mam katalog, który zawiera kilka symbolicznych linków:

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

Muszę skopiować je do bieżącego katalogu. Powstałe w ten sposób linki powinny być niezależne od swoich prototypów i prowadzić bezpośrednio do obiektów docelowych.

  • cp -s tworzy linki do linków, które nie zachowują się właściwie.
  • cp -s -L odmawia skopiowania linków do katalogów
  • cp -s -L -r odmawia skopiowania linków względnych do niedziałającego katalogu

Co należy zrobić?

Odpowiedzi (10)

212
212
212
2010-05-07 05:02:45 +0000
cp --preserve=links

Od strony głównej:

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

Osobiście, używam cp -av do większości moich ciężkich kopii. W ten sposób mogę zachować wszystko - nawet powtarzalnie - i zobaczyć wyjście. Oczywiście, to tylko osobiste preferencje.

Jeśli chodzi o to, dlaczego Twoje inne opcje nie spełniły Twoich oczekiwań, -s tworzy link instead do kopiowania, a -L podąża za linkami w źródle, aby znaleźć plik do skopiowania, zamiast kopiować same linki.

47
47
47
2010-05-07 04:39:24 +0000

Tak jak mówi man page, użyj -P.

30
30
30
2010-05-07 05:09:01 +0000

Jeśli łącza zawierają ścieżki względne, to skopiowanie łącza nie dostosuje ścieżki względnej. Użyj readlink, z przełącznikiem -f do podążania rekurencyjnie, aby uzyskać bezwzględną ścieżkę łącza. Na przykład:

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

Jeśli zachowanie ścieżek względnych jest tym czego chcesz, to opcja -P z cp, jak powiedział Ignacio Vazquez-Abrams, jest tym czego potrzebujesz.

24
24
24
2015-01-27 14:51:13 +0000

Jak niewielu skomentowało:

cp -a

działa dobrze.

Od człowieka:

-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
11
11
11
2012-05-15 17:25:32 +0000

Użyłem tego, aby zduplikować naprawdę duży katalog. Wszystkie symboliczne linki zostały zachowane, kopia została wykonana rekurencyjnie i byłem w stanie uzyskać pewne wizualne opinie na temat procesu:

cp -Prv /sourcer_dir/* /target_dir
11
11
11
2010-05-07 06:03:32 +0000

Przez większość czasu, kiedy muszę skopiować wiele symbolicznych linków, staram się odzwierciedlić drzewo katalogowe. Więc chcę symlink i wszystko inne.

To jest overkill dla kopiowania tylko kilku symlink, ale jeśli rzeczywiście próbujesz skopiować całe drzewo, to może być bardzo użyteczne:

Użyj tar.

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

tar nie rozwiązuje symlink domyślnie, więc symlink w kopii lustrzanej będzie wskazywać na te same miejsca, które są w oryginalnym drzewie.

Ta sztuczka wykorzystuje podpowłoki, aby komenda tar znalazła się u podstaw katalogu, który ma zostać powielony; możesz zostawić jedną z nich (wraz z powiązaną komendą cd), jeśli jesteś już w src lub dest katalogach:

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

Ponownie, nie jest to odpowiednie za każdym razem, gdy chcesz skopiować symboliczne linki, ale jest to bardzo użyteczny skrawek, aby wiedzieć.

4
4
4
2011-07-27 13:15:51 +0000

Spróbuj: cp -pr symlink destination

[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
3
3
2015-12-01 12:51:43 +0000

W Ubuntu podczas kopiowania linków i plików w katalogu:

cp --no-dereference --preserve=links
2
2
2
2019-01-12 17:55:13 +0000

Użyj opcji -P, jak Ignacio Vazquez-Abrams napisał powyżej . To czego nie wspomniał to -P nie ma żadnego efektu bez -R. Potrzebujesz więc co najmniej cp -RP.

(Strona nie pozwala mi jeszcze na komentarz, więc zamieściłem osobną odpowiedź).

1
1
1
2018-06-26 03:24:57 +0000

cp -s i cp -L to specjalne polecenia. Na Twoje potrzeby, nie używaj żadnych.

np. Kopiowanie katalogu DIR zawierającego a i symboliczny link b wskazujący na a.

  • cp -s DIR/* N/ tworzy symboliczny link zamiast kopiowania, N/a-\>../DIR/a (link) i N/b->(. ./DIR/b), która jest linkiem do linku
  • cp -L DIR/* N/ kopiuje z odwołaniem, N/a, N/b (tak samo jak DIR/a)

To czego potrzebujesz to N/a(=DIR/a), i N/b->../N/a; więc po prostu kopiuj bez odwoływania, używając opcji cp -P. Uważam, że jest to również domyślne dla cp.

  • -P no-dereference, zachowaj linki
  • -d combines -P option with -p to preserve=mode,ownership,timestamps
  • -a combines -d option with -R to recursively copy directories

refer man cp or cp --help for more options.