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

Hoe kopieer ik symbolische links?

Ik heb een directory die enkele symbolische links bevat:

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

Ik moet ze naar de huidige directory kopiëren. De resulterende links moeten onafhankelijk zijn van hun prototypes en direct naar hun doelobjecten leiden.

  • cp -s maakt links naar links die niet gepast zijn.
  • cp -s -L weigert links naar directories te kopiëren
  • cp -s -L -r weigert relatieve links naar niet-werkdirectory

te kopiëren Wat moet ik doen?

Antwoorden (10)

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

Vanaf de man pagina:

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

Persoonlijk gebruik ik cp -av voor het grootste deel van mijn zware kopieën. Op die manier kan ik alles bewaren - zelfs recursief - en de output zien. Natuurlijk, dat is gewoon persoonlijke voorkeur.

Wat betreft waarom je andere opties niet deden wat je verwachtte, maakt -s een link _in plaats van het kopiëren en -L volgt de links in de broncode om het te kopiëren bestand te vinden in plaats van het kopiëren van de links zelf.

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

Net zoals de man pagina zegt, gebruik -P.

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

Als de links relatieve paden bevatten, dan zal het kopiëren van de link het relatieve pad niet aanpassen. Gebruik readlink, met de schakelaar -f recursief te volgen, om het absolute pad van de link te krijgen. Bijvoorbeeld:

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

Als het behoud van de relatieve paden is wat je wilt, dan is de optie -P van cp, zoals gezegd door Ignacio Vazquez-Abrams, wat je nodig hebt.

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

Zoals een paar hebben opgemerkt:

cp -a

werkt goed.

Van de man:

-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

Ik heb het volgende gebruikt om een echt grote map te dupliceren. Alle symbolische links werden bewaard, de kopie werd recursief gemaakt en ik kon wat visuele feedback krijgen over het proces:

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

Meestal, als ik veel symbolische links moet kopiëren, probeer ik eigenlijk een mappenstructuur te spiegelen. Dus ik wil de symlinks en al het andere.

Dit is overkill voor het kopiëren van slechts een paar symlinks, maar als je daadwerkelijk een hele boom probeert te kopiëren, kan dit erg handig zijn:

Gebruik tar.

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

tar lost de symlink niet standaard op, dus zullen de symlinks in de spiegelkopie naar dezelfde locaties wijzen als die in de originele boom.

Deze truc maakt gebruik van subshells om het tar commando in positie te krijgen bij de root van de te spiegelen map; je kan één ervan weglaten (samen met het bijbehorende cd commando) als je al in de src of dest mappen zit:

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

Nogmaals, dit is niet geschikt voor elke keer dat je symbolische links wilt kopiëren, maar het is een erg handig stukje om te weten.

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

Probeer: 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

Op Ubuntu bij het kopiëren van links en bestanden in een directory:

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

Gebruik de optie -P, zoals Ignacio Vazquez-Abrams hierboven schreef . Wat hij niet vermeldde is -P heeft geen effect zonder -R. Dus je hebt op zijn minst cp -RP nodig.

(De site laat me nog geen commentaar geven, dus ik heb een apart antwoord gepost).

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

cp -s en cp -L zijn speciale commando’s. Gebruik voor uw eis geen.

b.v. Het kopiëren van een directory DIR met a en een symbolische link b die wijst naar a.

  • cp -s DIR/* N/ creëert een symbolische link in plaats van kopiëren, N/a->../DIR/a (link) en N/b->(. ./DIR/b) die een link is naar een link
  • cp -L DIR/* N/ kopieert met link dereferencing, N/a, N/b (hetzelfde als DIR/a)

Wat je nodig hebt is N/a(=DIR/a), en N/b->…/N/a; dus gewoon kopiëren zonder dereferencing, met behulp van de cp -P optie. Ik geloof dat dit ook de standaardinstelling is voor cp.

  • -P no-dereference, preserve links -d combineert -P optie met -p to preserve=mode,ownership,timestamps -a combineert -d optie met -R om directories

recursief te kopiëren man cp of cp --help voor meer opties.