Wie kopiere ich symbolische Links?

289296
Basilevs

Ich habe ein Verzeichnis, das einige symbolische Links enthält:

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 

Ich muss sie in das aktuelle Verzeichnis kopieren. Die resultierenden Verknüpfungen sollten unabhängig von ihren Prototypen sein und direkt zu ihren Zielobjekten führen.

  • cp -s erstellt Links zu Links, die kein angemessenes Verhalten darstellen.
  • cp -s -L weigert sich, Links zu Verzeichnissen zu kopieren
  • cp -s -L -r weigert sich, relative Links in ein nicht funktionierendes Verzeichnis zu kopieren

Was soll ich machen?

159
`cp -d` machte den Job auf meiner Seite. m-ric vor 10 Jahren 6
`cp -R` auf einem Mac Mirko vor 9 Jahren 1

9 Antworten auf die Frage

177
kainosnous
cp --preserve=links 

Aus der Manpage:

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

Persönlich verwende ich cp -av für den größten Teil meines umfangreichen Kopierens. Auf diese Weise kann ich alles - auch rekursiv - bewahren und die Ausgabe sehen. Das ist natürlich nur persönliche Vorlieben.

Warum Ihre anderen Optionen nicht das getan haben, was Sie erwartet haben, erstellt -seinen Link statt zu kopieren und -Lfolgt den Links in der Quelle, um die zu kopierende Datei zu finden, anstatt die Links selbst zu kopieren.

Möglicherweise müssen Sie `-R` hinzufügen, da andernfalls Verzeichnisse und Symlinks zu Verzeichnissen übersprungen werden. Olivier 'Ölbaum' Scherler vor 11 Jahren 3
Ich habe es mit Redhat ausprobiert und es funktioniert nicht Mansuro vor 10 Jahren 7
Genau das, was ich zwischen Amazon und Amazon AMI kopieren musste. Perfekt! notacouch vor 10 Jahren 0
auf einem Mac? Verwenden Sie "cp -a" Steve Tauber vor 10 Jahren 33
Eigenschaften sehen anders aus. Und im Gegensatz zu einem regulären Link (wie ich in / usr / bin zB Java sehe), sehe ich kein Linkziel mehr, wenn ich die Eigenschaften mit Ubuntu GNOME-Dateien oder Nautilus oder was auch immer ich verwende, öffne Crowie vor 10 Jahren 0
+1 für die Option "-a". Heh, ich habe unzählige Male nach Optionen in der `cp`-Manpage gesucht, aber ich muss diese immer überflogen haben. Ich habe bis jetzt `-dpr` verwendet, aber` -a` deckt alle diese Funktionen ab, sowie die Beibehaltung einiger anderer Attribute. Wenn ich diese anderen Attribute gebraucht hätte, hätte ich wahrscheinlich die Option --preserve erneut gesucht und `-dr --preserve = all` verwendet. Genau das ist` -a`! Zumindest weiß ich jetzt - "-a" ist perfekt und das ist es, was ich von nun an verwenden werde. James Haigh vor 9 Jahren 9
Das hat auf Cygwin nicht funktioniert. `--preserve = links` war nicht genug. Es sagte immer noch "cp: Verzeichnis weglassen". Aber "-av" hat funktioniert. Chloe vor 8 Jahren 3
@JamesHaigh auf meinem Mac, man cp sagt "-a Entspricht den -pPR-Optionen. Behält Struktur und Attribute von Dateien, aber keine Verzeichnisstruktur bei." Das klingt ziemlich beängstigend, da der Hauptpunkt beim Kopieren einer Ordnerstruktur nicht erhalten bleibt. Was bedeutet es, wenn nicht, dass es flach kopiert wird? AnneTheAgile vor 7 Jahren 0
Unter Ubuntu 16.04 macht `--preserve = link` den Trick nicht. Stattdessen gelingt 'cp -a'. MarcusJuniusBrutus vor 7 Jahren 0
35
Ignacio Vazquez-Abrams

Wie die Manpage sagt, benutzen Sie -P.

Auf Mac funktioniert `-P` nicht in Verzeichnissen, also habe ich` cp -a` verwendet Steve Tauber vor 10 Jahren 7
Vielen Dank, ich habe Ihre Antwort 3 Mal zu unterschiedlichen Zeitpunkten im Laufe eines Jahres gesehen und genutzt. Kann mich nicht erinnern? Siddhartha vor 10 Jahren 4
Das funktioniert, aber meine Manpage sagt "-P folgt niemals symbolischen Links in SOURCE", was nicht intuitiv mit "Kopieren von Symlinks als Symlinks zum Ziel" identisch ist. ("never follow" klingt wie in Kombination mit -R) R.M. vor 7 Jahren 0
Dieses `cp -P` ist anders als die von Topo gewählte Antwort von @kainosnous für mich. Vielen Dank! tommy.carstensen vor 7 Jahren 0
Funktioniert auf Redhat. Die akzeptierte Antwort funktioniert nicht! Phiber vor 7 Jahren 0
27
mrucci

Wenn die Links relative Pfade enthalten, wird durch das Kopieren des Links der relative Pfad nicht angepasst. Verwenden Sie readlink, um mit dem Schalter -frekursiv zu folgen, um den absoluten Pfad der Verknüpfung zu erhalten. Zum Beispiel:

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

Wenn die Erhaltung der relativen Pfade, was Sie wollen, als die Möglichkeit -Pvon cp, sagte, wie von Ignacio Vazquez-Abrams, ist das, was Sie brauchen.

Es ist möglicherweise keine gute Idee, rekursiv zu dereferenzieren, wenn Sie lediglich Symlinks von relativ zu absolut konvertieren möchten. Die Rekursion ist hier nicht erforderlich, und manchmal sind verkettete Symlinks aus einem bestimmten Grund vorhanden. Symlinks werden häufig verwendet, um Auswahlmöglichkeiten oder Konfigurationsoptionen anzugeben. Auf meinem System gibt es beispielsweise eine Symlink-Kette `/ usr / share / dict / words -> / etc / Wörterbücher-common / words -> / usr / share / dict / british-english`, die das bevorzugte Wörterbuch angibt. Wenn Sie diese Kette rekursiv dereferenzieren, ignoriert der resultierende Symlink zukünftige Änderungen an dieser Einstellung. James Haigh vor 9 Jahren 1
19
Juh_

Wie einige kommentiert haben:

cp -a 

funktioniert gut.

Vom mann:

-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 
... aber nur wenn keiner der symbolischen Links zu relativen Pfaden führt. Michael Scheper vor 7 Jahren 1
9
oarevalo

Ich habe folgendes verwendet, um ein wirklich großes Verzeichnis zu kopieren. Alle symbolischen Links wurden beibehalten, die Kopie wurde rekursiv erstellt und ich konnte visuelles Feedback über den Vorgang erhalten:

cp -Prv /sourcer_dir/* /target_dir 
8
quack quixote

Meistens, wenn ich viele symbolische Links kopieren muss, versuche ich eigentlich, einen Verzeichnisbaum zu spiegeln. Ich möchte also die Symlinks und alles andere.

Dies ist ein Overkill für das Kopieren einiger Symlinks. Wenn Sie jedoch tatsächlich versuchen, einen gesamten Baum zu kopieren, kann dies sehr nützlich sein:

Verwenden Sie Teer .

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

tar löst den symbolischen Link nicht standardmäßig auf, sodass symbolische Links in der Spiegelkopie auf dieselben Positionen verweisen wie die im ursprünglichen Baum.

Bei diesem Trick werden Subshells verwendet, um den Befehl tar im Stammverzeichnis des zu spiegelnden Verzeichnisses in Position zu bringen. Sie können einen von ihnen (zusammen mit dem zugehörigen Befehl cd ) auslassen, wenn Sie sich bereits im Verzeichnis src oder dest befinden :

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

Dies ist wiederum nicht für jedes Mal geeignet, wenn Sie symbolische Links kopieren möchten, aber es ist ein sehr nützlicher Ausschnitt.

tar ist definitiv tragbarer als cp in meiner erfahrung don bright vor 6 Jahren 1
3
ebe0

Versuchen Sie es mit: cp -pr Symlink-Ziel

[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)

1
Amiramix

Unter Ubuntu beim Kopieren von Links und Dateien in ein Verzeichnis:

cp --no-dereference --preserve=links 
"cp -d" ist die Abkürzung dafür hunse vor 7 Jahren 3
0
Atif Hussain

cp -s und cp -L sind spezielle Befehle. Verwenden Sie für Ihre Anforderung keine.

Beispiel: Kopieren eines Verzeichnisses DIR mit einem symbolischen Link b, der auf a zeigt.

  • cp -s DIR / * N / erstellt anstelle des Kopierens eine symbolische Verknüpfung, N / a - .. .. / DIR / a (Verknüpfung) und N / b -> (../ DIR / b), die eine Verknüpfung zu einer Verknüpfung darstellt
  • cp -L DIR / * N / Kopien mit Link-Dereferenzierung, N / a, N / b (wie DIR / a)

Was Sie brauchen, ist N / a (= DIR / a) und N / b -> ../ N / a; Kopieren Sie also ohne Dereferenzierung mit der Option cp -P. Ich glaube, das ist auch der Standard für cp.

  • -P keine Dereferenzierung, Links beibehalten
  • -d kombiniert die Option -P mit -p, um Modus, Besitz und Zeitstempel zu erhalten
  • -a kombiniert die Option -d mit -R, um Verzeichnisse rekursiv zu kopieren

beziehen man cpoder cp --helpfür weitere Optionen.