it-swarm.com.de

Wie kann ich viele defekte Symlinks "neu verknüpfen"?

Ich habe einen Verzeichnisbaum mit einer Reihe symbolischer Links zu Dateien unter /home. Ich habe jedoch /home Nach /mnt/home Verschoben und brauche eine Möglichkeit zum "erneuten Verknüpfen". alle Symlinks. Gibt es solche Funktionen oder muss ich dazu ein Skript schreiben?

Als Beispiel habe ich so etwas wie das Folgende:

[[email protected] ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

Ich möchte einen Befehl, der alle Symlinks findet und an denselben Stellen neu verknüpft, jedoch unter /mnt/home Anstelle von /home

Existiert ein solcher Befehl?

55
Josh

Es gibt keinen Befehl zum erneuten Ausrichten eines symbolischen Links. Sie können ihn lediglich entfernen und einen weiteren erstellen. Angenommen, Sie haben GNU-Dienstprogramme (z. B. unter nicht eingebettetem Linux oder Cygwin)), können Sie die -lname - Primärdatei von find verwenden, um symbolische Links nach ihrem Ziel abzugleichen und readlink, um den Inhalt des Links zu lesen. Ungetestet:

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \;

Es wäre besser, diese symbolischen Verknüpfungen relativ zu machen. Es gibt ein praktisches kleines Dienstprogramm namens symlinks (ursprünglich von Mark Lords, jetzt von J. Brandt Buckley gepflegt), das in vielen Linux-Distributionen vorhanden ist. Führen Sie vor dem Verschieben oder nachdem Sie gültige Links wie oben wiederhergestellt haben, symlinks -c /mnt/home/someone/something Aus, um alle absoluten Symlinks unter dem angegebenen Verzeichnis in relative Symlinks zu konvertieren, sofern sie keine Dateisystemgrenze überschreiten.

Ich weiß, dass dies nicht genau das ist, was der Autor verlangt, aber es scheint, dass sie bereits ihre Antwort haben, also füge ich dies für andere wie mich hinzu, die über die Frage stolpern.

Das Folgende sollte helfen, wenn eine flexiblere Lösung erforderlich ist, z. B. eine Reihe defekter symbolischer Links, die durch Ersetzen eines Teils der Ziele des symbolischen Links behoben werden können.

z.B. Nach einer Änderung des Benutzernamens, um den alten Benutzernamen durch den neuen Benutzernamen im Ziel vieler Links zu ersetzen, nachdem der Umzug bereits durchgeführt wurde. Erstellen Sie ein Skript mit dem Namen replace-simlinks (siehe unten):

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm "$link"
#ln -s "$target" "$link"

und rufen Sie es mit dem folgenden Befehl auf:

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

Hoffe das hilft jemandem

edit: Danke Gilles für den Kickstart dieses Skripts und den Tipp zur Verwendung des Symlinks-Skripts, um die Links relativ zu machen.

13
Gerry

Erstellen /home als Symlink zu /mnt/home, und alle vorhandenen Symlinks sind wieder gültig.

4
Keith Thompson