Symbolische Links rekursiv ändern

X

xalo

Grünschnabel
Hallo,

ich möchte im Unix-Filesystem in einem Ordner mit Unterordnern alle symbolischen Links ändern bzw. eine Pfadangabe im symbolischen Link ersetzen.

Beispiel:

SymLink "aa --> /XX/aa" ändern nach "aa --> /YY/aa"

Das ganze soll für alle symbolischen Links per Skript oder Befehlzeile funktionieren.

Danke im Voraus...:)
 
Sind die Verzeichnisnamen und die Zielnamen immer gleich?

Also "XX" wird immer zu "YY" und "aa" zeigt immer im Unterverzeichnis auf "aa"?

Oder sind noch mehrere Verzeichnisnamen im Spiel?

Villeicht lieferst Du mal einige original Links ohne diese Pseudonamen....
(meist sieht es mit richtigen Namen wieder ganz anders aus...)
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Bitte Script vorher an Test-Daten ausprobieren....
Aktuell habe ich vorsichtshalber

Code:
find . -type l -exec ls -l {} \; | cut -d" " -f9,11 | while read linkname linkziel; do

        linkzielneu="`echo $linkziel | sed 's/\/XX\//\/YY\//g'`"
        echo Link $linkname zeigt nach $linkziel - ändern nach $linkzielneu

        # wenn Script OK das folgende echo vor dem rm Befehl und die Quotes vor und hinter den Befehlen entfernen.....
        echo "rm $linkname && ln -s $linkzielneu $linkname"

done
 
Zuletzt bearbeitet:
Also, die benötigten Anwendungsdaten mit den symbolischen Links liegen stets in "/usr/lpp/...".

Ich befinde mich in einem beliebigen Ordner und habe folgende Symlinks:
datei1 --> /PROD/usr/lpp/datei1
datei2 --> /PROD/usr/lpp/datei2 ...

Nun wird PROD in TEST geändert und die Software bekommt ein Problem, weil der Symlink immer noch auf PROD zeigt.

Die Symlinks sollen richtig hingebogen werden:
datei1 --> /TEST/usr/lpp/datei1
datei2 --> /TEST/usr/lpp/datei2 ...

Es würde auch reichen, den String "/PROD" aus den Symlinks zu entfernen. Dann wäre ich vom Systemnamen unabhängig, also:

datei1 --> /usr/lpp/datei1
datei2 --> /usr/lpp/datei2 ...

Die Symlinks sollen auch in allen Unterordnern korrigiert werden...

Ich hoffe, dass ich es einigermaßen darstellen konnte.
 
OK. - ich habe noch mal eine kleine Änderung gemacht.....
  • Parameter "maxdepth" - hierfür werden nur Links aus dem aktuellen Verzeichnis gefunden - nicht in Unterverzeichnissen.
  • und hinter dem Find-Befehl habe ich noch einen grep-Befehl eingebaut, damit wirklich nur die Links geändert werden, die nach /PROD/usr/lpp zeigen.
Code:
find . [B]-maxdepth 1[/B] -type l -exec ls -l {} \; | cut -d" " -f9,11 | [B]grep "\/PROD\/usr\/lpp\/"[/B] | while read linkname linkziel; do

        #ändern nach /usr/lpp/
        linkzielneu="`echo $linkziel | sed 's/\/PROD\/usr\/lpp\//\/usr\/lpp\//g'`"

        #alternativ ändern nach /TEST/usr/lpp/
        # linkzielneu="`echo $linkziel | sed 's/\/PROD\/usr\/lpp\//\/TEST\/usr\/lpp\//g'`"

        echo Link $linkname zeigt nach $linkziel - ändern nach $linkzielneu

        # wenn Script OK das folgende echo vor dem rm Befehl und die Quotes vor und hinter den Befehlen entfernen.....
        echo "rm $linkname && ln -s $linkzielneu $linkname"

done

Um das Script auszuführen, musst Du in dem Verzeichnis stehen, in dem sich die Link befinden....
 
Zuletzt bearbeitet:
Hallo HBtux,
ich musste einige kleine Änderungen machen, weil "maxdepth" unbekannt war??? und habe zusätzlich awk benutzt:

find . -type l -exec ls -l {} \; | awk '{print $9,$11}' | grep ...

Ansonsten ist alle super. Danke für die schnelle Hilfe. :)
 

Ähnliche Themen

Suchen und Ersetzen mit regulärem Ausdruck

Samba Dateien und Ordner verschieben

Summe von Zahlen in einer Zeilen bilden

Shell Skript beschleunigen

Shell Skript zum automatischen Aufräumen von doppelten Ordnern

Zurück
Oben