it-swarm.com.de

Wie kopiere ich symbolische Links?

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

[email protected]: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 sich nicht angemessen verhalten.
  • cp -s -L verweigert das Kopieren von Links zu Verzeichnissen
  • cp -s -L -r weigert sich, relative Links in ein nicht funktionierendes Verzeichnis zu kopieren

Was soll ich machen?

173
Basilevs
cp --preserve=links

Von 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 die meisten meiner umfangreichen Kopien. Auf diese Weise kann ich alles - auch rekursiv - beibehalten und die Ausgabe sehen. Das ist natürlich nur eine persönliche Präferenz.

In Bezug auf den Grund, warum Ihre anderen Optionen nicht das getan haben, was Sie erwartet hatten, erstellt -s einen Link statt zum Kopieren, und -L folgt den Links in der Quelle, um die zu kopierende Datei zu finden, anstatt die Links selbst zu kopieren.

193
kainosnous

Verwenden Sie -P, wie in der Manpage angegeben.

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

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

Wenn Sie die relativen Pfade beibehalten möchten, benötigen Sie die von Ignacio Vazquez-Abrams angegebene Option -P von cp.

28
mrucci

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
23
Juh_

Die meiste Zeit, wenn ich viele symbolische Links kopieren muss, versuche ich tatsächlich, einen Verzeichnisbaum zu spiegeln. Also möchte ich die Symlinks und alles andere.

Dies ist zu viel des Guten, um nur ein paar Symlinks zu kopieren. Wenn Sie jedoch tatsächlich versuchen, einen ganzen Baum zu kopieren, kann dies sehr nützlich sein:

Verwenden Sie tar .

[email protected]:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

tar löst den Symlink nicht standardmäßig auf, sodass Symlinks in der Spiegelkopie auf die gleichen Positionen verweisen wie die im ursprünglichen Baum.

Dieser Trick verwendet Subshells, um den Befehl tar im Stammverzeichnis des zu spiegelnden Verzeichnisses zu positionieren. Sie können einen davon (zusammen mit dem zugehörigen Befehl cd ) weglassen, wenn Sie sich bereits in den Verzeichnissen src oder dest befinden:

# already in src?
[email protected]:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
[email protected]:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

# just need src/foo?
# this result will be a mirror copy at dest/foo 
[email protected]:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )

# mirror to another system?
[email protected]:/src$ tar cf - . | ssh [email protected] '( 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 Ausschnitt, den Sie kennen müssen.

10
quack quixote

Ich habe Folgendes verwendet, um ein wirklich großes Verzeichnis zu duplizieren. Alle symbolischen Verknüpfungen wurden beibehalten, die Kopie wurde rekursiv erstellt und ich konnte einige visuelle Rückmeldungen zum Vorgang erhalten:

cp -Prv /sourcer_dir/* /target_dir
10
oarevalo

Versuchen Sie: cp -pr symlink destination

[[email protected] 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
[[email protected] temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[[email protected] 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
[[email protected] temp]# 

OS - Centos 5 (Linux)

4
ebe0

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

cp --no-dereference --preserve=links
3
Amiramix

Verwenden Sie die Option -P, wie Ignacio Vazquez-Abrams oben schrieb . Was er nicht erwähnte ist, dass -P ohne -R keine Wirkung hat. Du brauchst also mindestens cp -RP.

(Auf der Website kann ich noch keine Kommentare abgeben, daher habe ich eine separate Antwort gepostet.)

1
1234ru

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

z.B. Kopieren eines Verzeichnisses DIR mit a und einer symbolischen Verknüpfung b, die auf a zeigt.

  • cp -s DIR/* N/erstellt eine symbolische Verknüpfung anstatt zu kopieren, 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 einfach ohne Dereferenzierung mit der Option cp -P. Ich glaube, das ist auch die Standardeinstellung für cp.

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

weitere Optionen finden Sie unter man cp oder cp --help.

1
Atif Hussain