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 Verzeichnissencp -s -L -r
weigert sich, relative Links in ein nicht funktionierendes Verzeichnis zu kopierenWas soll ich machen?
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.
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
.
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
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.
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
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)
Unter Ubuntu beim Kopieren von Links und Dateien in ein Verzeichnis:
cp --no-dereference --preserve=links
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.)
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.
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.
weitere Optionen finden Sie unter man cp
oder cp --help
.