Frage Wie kopiere ich symbolische Links?


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 Links sollten von ihren Prototypen unabhängig sein und direkt zu ihren Zielobjekten führen.

  • cp -s erstellt Links zu Links, die nicht geeignet sind.
  • 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?


147
2018-05-07 04:36


Ursprung


cp -d machte den Job auf meiner Seite. - m-ric
cp -R auf einem Mac - Mirko


Antworten:


cp --preserve=links

Von der man-Seite:

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

Persönlich benutze ich cp -av  für die meisten meiner schweren Kopieren. Auf diese Weise kann ich alles - sogar rekursiv - bewahren und die Ausgabe sehen. Natürlich ist das nur persönliche Vorliebe.

Warum deine anderen Optionen nicht das getan haben, was du erwartet hast, -s macht eine Verbindung stattdessen Kopieren und -L folgt den Links in der Quelle, um die zu kopierende Datei zu finden, anstatt die Links selbst zu kopieren.


167
2018-05-07 05:02



Sie müssen möglicherweise hinzufügen -R, weil sonst cp Verzeichnisse und Symlinks zu Verzeichnissen überspringt. - Olivier 'Ölbaum' Scherler
Ich habe es auf redhat versucht und es funktioniert nicht - Mansuro
auf einem Mac? benutzen cp -a - Steve Tauber
+1 für die -a Möglichkeit. Heh, ich habe nach Optionen gesucht cpManualpage unzählige Male, aber ich muss immer über diese Manpage. Ich habe bis jetzt benutzt -dpr, aber -a umfasst alle diese, plus die Erhaltung von ein paar anderen Eigenschaften. Wenn ich diese anderen Attribute gebraucht hätte, hätte ich wahrscheinlich nachgesehen --preserve Option erneut und verwendet -dr --preserve=allWas genau ist das? -a ist! Nun, zumindest weiß ich es jetzt - -a ist perfekt und das ist es, was ich von jetzt an benutzen werde. - James Haigh
Dies hat bei Cygwin nicht funktioniert. --preserve=links war nicht genug. Es sagte immer noch cp: omitting directory. Aber -av hat funktioniert. - Chloe


Genau wie die Manpage sagt, benutze -P.


32
2018-05-07 04:39



auf Mac -P funktioniert nicht auf Verzeichnissen, also habe ich verwendet cp -a - Steve Tauber
Danke, ich habe gesehen und profitiert von Ihrer Antwort 3 Mal jetzt unterschiedliche Zeiten über ein Jahr. Kann mich nicht daran erinnern! - Siddhartha
Das funktioniert, aber meine Manpage sagt "-P folge niemals symbolischen Links in SOURCE", was nicht intuitiv dasselbe ist wie "Symlinks als Symlinks zum Ziel kopieren". ("Niemals folgen" klingt wie es in Kombination mit -R funktioniert) - R.M.
Dies cp -P Anders als die von mir gewählte Antwort von @kainosnous funktioniert das für mich. Vielen Dank! - tommy.carstensen
Funktioniert auf Redhat. Die angenommene Antwort funktioniert nicht! - Phiber


Wenn die Verknüpfungen relative Pfade enthalten, wird beim Kopieren der Verknüpfung der relative Pfad nicht angepasst. Benutzen readlinkmit dem Schalter -f rekursiv zu folgen, um den absoluten Pfad der Verbindung zu erhalten. Beispielsweise:

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

Wenn Sie die relativen Pfade beibehalten möchten, ist dies die Option -P von cpWie von Ignacio Vazquez-Abrams gesagt, ist was du brauchst.


26
2018-05-07 05:09



Es kann eine schlechte Idee sein, rekursiv zu dereferenzieren, wenn Sie nur versuchen, Symlinks von relativ zu absolut zu konvertieren. Die Rekursion wird hier nicht benötigt und manchmal sind verkettete Symlinks aus einem bestimmten Grund vorhanden. Symlinks werden oft verwendet, um Auswahlmöglichkeiten oder Konfigurationsoptionen anzugeben. Zum Beispiel gibt es auf meinem System eine Symlink-Kette /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english welches das bevorzugte Wörterbuch spezifiziert. Wenn Sie diese Kette rekursiv dereferenzieren würden, würde der resultierende Symlink alle zukünftigen Änderungen dieser Präferenz ignorieren. - James Haigh


Wie einige wenige kommentiert haben:

cp -a 

funktioniert gut.

Von dem 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

16
2018-01-27 14:51



... aber nur, wenn keiner der symbolischen Links zu relativen Pfaden führt. - Michael Scheper


Ich habe das Folgende benutzt, um ein wirklich großes Verzeichnis zu duplizieren. Alle symbolischen Links wurden beibehalten, die Kopie wurde rekursiv erstellt und ich konnte eine visuelle Rückmeldung zum Prozess erhalten:

cp -Prv /sourcer_dir/* /target_dir

9
2018-05-15 17:25





Meistens versuche ich, wenn ich viele symbolische Links kopieren muss, einen Verzeichnisbaum zu spiegeln. Also ich will die Symlinks und alles andere.

Dies ist ein Overkill für das Kopieren von ein paar Symlinks, aber wenn Sie tatsächlich versuchen, einen ganzen Baum zu kopieren, kann dies sehr nützlich sein:

Benutzen Teer.

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

Teer löst den Symlink standardmäßig nicht auf, sodass Symlinks in der Spiegelkopie auf die gleichen Speicherorte wie in der ursprünglichen Struktur verweisen.

Dieser Trick nutzt Subshells, um die Teer Befehl an der Wurzel des Verzeichnisses, das gespiegelt werden soll; Sie können einen von ihnen (zusammen mit dem zugehörigen) auslassen CD Befehl) wenn Sie bereits in der src oder dest Verzeichnisse:

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

Auch dies ist nicht für jedes Mal geeignet, wenn Sie symbolische Links kopieren möchten, aber es ist ein sehr nützlicher Code, den Sie kennen sollten.


8
2018-05-07 06:03



Teer ist definitiv portabler als CP nach meiner Erfahrung - don bright


Versuchen: 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]# 

Betriebssystem - Centos 5 (Linux)


3
2017-07-27 13:15





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

cp --no-dereference --preserve=links

1
2017-12-01 12:51



cp -d ist die Abkürzung dafür - hunse


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

z.B. Kopieren eines Verzeichnisses DIR, das einen a und einen symbolischen Link b enthält, der auf a verweist.

  • cp -s DIR / * N / erstellt eine symbolische Verknüpfung anstelle von Kopieren, N / a -> ../ DIR / a (Verbindung) und N / b -> (../ DIR / b), die Verknüpfung zu einer Verknüpfung ist
  • cp -LL 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 einfach ohne Dereferenzierung mit der Option cp -P. Ich glaube, das ist auch der Standard für CP.

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

verweisen man cp oder cp --help für mehr Optionen.


0
2018-06-26 03:24