30 Stimmen

Symbolischer Link, der eine Verzeichnishierarchie kopiert

Was ist der einfachste Weg auf Linux, um ein Verzeichnisbaum zu "kopieren", sodass ein neuer Verzeichnisbaum erstellt wird, während alle "Dateien" nur Symlinks sind, die auf die tatsächlichen Dateien im Quellverzeichnis verweisen?

cp -s funktioniert nicht rekursiv.

1 Stimmen

40voto

freiheit Punkte 4866

Ich habe gerade einen schnellen Test auf einem Linux-Rechner gemacht und cp -sR /orig /dest macht genau das, was du beschrieben hast: Es erstellt eine Verzeichnishierarchie mit Symlinks für Nicht-Verzeichnisse zurück zum Original.

4 Stimmen

Es funktioniert nur auf der ersten Verzeichnisebene. Für jede Datei in Unterverzeichnissen erhalte ich die Meldung "xyz-Datei: Kann relative Symbolic Links nur im aktuellen Verzeichnis erstellen". (Auf Ubuntu 8.10, cp Version 6.10)

39 Stimmen

Der Grund, warum Sie die Meldung "xyz-Datei: kann nur relative symbolische Links im aktuellen Verzeichnis erstellen" erhalten, liegt daran, dass Sie für das Quellverzeichnis einen relativen Pfad angegeben haben. Es funktioniert so, wie Sie es wünschen, wenn Sie einen absoluten Pfad für die Quelle angeben, beispielsweise "cp -sR /root/absoluter/pfad/name dest".

6 Stimmen

Im Falle, dass Sie alle Symlinks relativ machen müssen/möchten, können Sie symlinks wie folgt verwenden: cp -sR /orig /dest && symlinks -rc /dest

19voto

PonyEars Punkte 2035
cp -as /root/absoluter/pfad/name dest_dir

wird tun, was du willst. Beachten Sie, dass der Quellname ein absoluter Pfad sein muss, er kann nicht relativ sein. Andernfalls erhalten Sie diesen Fehler: "xyz-Datei: Kann nur relative symbolische Links im aktuellen Verzeichnis erstellen."

Seien Sie auch vorsichtig, was Sie kopieren: Wenn dest_dir bereits existiert, müssen Sie etwas wie folgt tun:

cp -as /root/absoluter/pfad/name/* dest_dir/
cp -as /root/absoluter/pfad/name/.* dest_dir/

13voto

Drew Stephens Punkte 16217

Ausgehend von oben, den ursprünglichen und neuen Verzeichnissen, denke ich, dass dieses Paar von find(1)-Befehlen das machen wird, was du brauchst:

find original -type d -exec mkdir new/{} \;
find original -type f -exec ln -s {} new/{} \;

Die erste Instanz richtet die Verzeichnisstruktur ein, indem sie nur Verzeichnisse im ursprünglichen Baum findet und sie im neuen Baum neu erstellt. Die zweite erstellt die symbolischen Links zu den originalen Dateien im neuen Baum.

1 Stimmen

Dies funktioniert sehr gut für mich (wie oben erwähnt, funktioniert cp -as oder -Rs nicht unter Mac OS X). Es könnte eine gute Idee sein, (cd origParentDir; find origDir .. ; find origDir ..) zu verwenden, um den relativen Pfad als Parameter für sowohl mkdir als auch ln -s zu erhalten. Verwenden Sie Klammern, um ein (Subshell) zu starten, da das Ausführen von cd in einer Subshell nur das CWD vorübergehend festlegt; Das CWD wird wiederhergestellt, wenn die Subshell beendet wird. z.B. wenn Sie '/src/binutils-2.24' nach '${HOME}/source' 'klonen', dann möchten Sie nicht, dass der 'src' -Ordner erstellt wird.

0 Stimmen

Merkwürdig, dass ln keine rekursive Option hat... ähnlich wie ln -s -R orig/dir dest/dir.

7voto

Es gibt auch das "lndir" Dienstprogramm (von X), das so etwas macht; Ich habe es hier erwähnt gefunden: Debian-Fehlerbericht Nr. 301030: Können wir lndir zu coreutils oder debianutils verschieben? und benutze es jetzt glücklich.

2 Stimmen

Ich hatte genau das gleiche Problem wie der/die originale Fragesteller/in und nachdem ich angefangen hatte, ein Shell-Skript zu coden, fand ich diese Antwort und entdeckte, dass lndir bereits installiert war. Funktioniert genau so, wie ich es brauche.

1voto

JesperE Punkte 61161

Ich habe mich ein wenig bei Google umgeschaut und einen Befehl namens lns gefunden, verfügbar von hier.

0 Stimmen

Warum empfehlen Sie ein Tool eines Drittanbieters, wenn cp mit einigen (2) Optionen den Job erledigt? Das scheint mir ein Sicherheitsrisiko zu sein.

0 Stimmen

Weil ich vor acht Jahren, als ich die Antwort geschrieben habe, die -s Option nicht kannte. Fühlen Sie sich frei, hochzuvoten/runterzuvoten, wenn Sie denken, dass die Antwort gut/schlecht ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X