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 Verknüpfungen zu Verknüpfungen, die nicht dem entsprechenden Verhalten entsprechen.cp -s -L
weigert sich, Links zu Verzeichnissen zu kopierencp -s -L -r
weigert sich, relative Links in ein nicht funktionierendes Verzeichnis zu kopieren
Was soll ich machen?
linux
command-line
symbolic-link
cp
Basilevs
quelle
quelle
cp -d
machte den Job auf meiner Seite.cp -R
auf einem MacAntworten:
Von der Manpage:
Persönlich benutze ich
cp -av
für die meisten meiner schweren Kopieren. Auf diese Weise kann ich alles - auch rekursiv - beibehalten und die Ausgabe sehen. Das ist natürlich nur eine persönliche Präferenz.Wie, warum Ihre andere Optionen tun nicht , was Sie erwartet haben ,
-s
macht einen Link anstelle des Kopierens und-L
folgt den Links in der Quelle , die Datei zu finden , sich selbst zu kopieren , anstatt die Links zu kopieren.quelle
-R
, da cp sonst Verzeichnisse und Symlinks zu Verzeichnissen überspringt.cp -a
-a
Option. Heh, ich habecp
unzählige Male in der Manpage nach Optionen gesucht , aber ich muss immer darüber nachgedacht haben. Ich habe bis jetzt verwendet-dpr
, aber-a
umfasst alle diese, sowie die Erhaltung von ein paar anderen Attributen. Wenn ich diese anderen Attribute gebraucht hätte, hätte ich die--preserve
Option wahrscheinlich erneut gesucht und verwendet-dr --preserve=all
, und genau das-a
ist es! Nun, zumindest weiß ich es jetzt --a
ist perfekt und das ist es, was ich von nun an verwenden werde.--preserve=links
war nicht genug. Es sagte immer nochcp: omitting directory
. Hat aber-av
geklappt.So wie der Mann Seite sagt, verwenden
-P
.quelle
-P
funktioniert nicht auf Verzeichnissen, also habe ich verwendetcp -a
cp -P
funktioniert anders als die von @kainosnous oben gewählte Antwort für mich. Vielen Dank!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 zu erhalten. Zum Beispiel:Wenn Sie die relativen Pfade beibehalten möchten, ist die Option
-P
voncp
, wie von Ignacio Vazquez-Abrams gesagt, die richtige.quelle
/usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english
die das bevorzugte Wörterbuch angibt. Wenn Sie diese Kette rekursiv dereferenzieren, ignoriert der resultierende Symlink alle zukünftigen Änderungen an dieser Präferenz.Wie einige kommentiert haben:
funktioniert gut.
Vom mann:
quelle
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:
quelle
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 Teer .
tar löst den Symlink nicht standardmäßig auf, daher verweisen Symlinks in der Spiegelkopie auf dieselben Speicherorte 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 im Verzeichnis src oder dest befinden :
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.
quelle
Versuchen Sie: cp -pr symlink destination
OS - Centos 5 (Linux)
quelle
Unter Ubuntu beim Kopieren von Links und Dateien in ein Verzeichnis:
quelle
cp -d
ist die Abkürzung dafürcp -a
undcp --preserve=links
mache mehr als die Frage stellt. Soweit ich weiß, ist dies die richtige Antwort für jedencp
, der Dateien wie in der Frage verwendet (keine Verzeichnisse),--no-dereference
die jedoch keine Wirkung haben würden.Benutze die
-P
Option, wie Ignacio Vazquez-Abrams oben schrieb . Was er nicht erwähnt hat,-P
hat keine Wirkung ohne-R
. Also brauchst du wenigstenscp -RP
.(Auf der Website kann ich noch keine Kommentare abgeben, daher habe ich eine separate Antwort gepostet.)
quelle
cp -s und cp -L sind spezielle Befehle. Verwenden Sie für Ihre Anforderung none.
zB Kopieren eines Verzeichnisses DIR mit a und einem symbolischen Link b, der 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.
beziehen
man cp
odercp --help
für weitere Optionen.quelle