HomeSoftwareSpieleMusikForum

Linkziel ändern

Löscht oder verschiebt man eine Datei, die das Ziel eines oder mehrerer Links darstellt, zeigen die Links anschließend ins Leere. Die Folge können Programmabstürze und sonstige Unannehmlichkeiten sein. Um das zu vermeiden, müssen in einem solchen Fall alle auf diese Dateien verweisenden Links korrigiert werden. Allerdings setzt das voraus, dass man sie überhaupt kennt - was nicht immer der Fall ist. Hier gibt es ein Problem: Man kann zwar leicht feststellen, wohin ein Link zeigt (siehe getlink), aber man kann einer Datei nicht unmittelbar ansehen, ob und welche Links auf sie verweisen, denn es gibt keine Rückwärtsverweise. Die einzige Möglichkeit besteht darin, im Dateisystem (oder einem Teil davon) nach ihnen zu suchen.

Das nachstehend beschriebene Script chglink dient diesem Zweck. Es durchsucht ein vorgegebenes Verzeichnis nach Links, die auf ein bestimmtes Ziel verweisen, und gibt sie entweder aus oder ersetzt sie gleich durch Verweise auf ein anderes (vorzugsweise existierendes) Ziel.

Aufruf:

chglink [option...]verzeichnis zielAlt [zielNeu]

Optionen:

-h  Hilfe.
-l  Absolute Pfade vergleichen (s.u.).
-p  Partieller Vergleich (s.u.).
-r  Rekursiv.
-t  Test, Kommandos werden nur ausgegeben, nicht ausgeführt.
-v  Mit Protokoll.

Der erste Dateiparameter ist das zu durchsuchende Verzeichnis, der zweite der alte Link, der dritte der neue. Fehlt der dritte Parameter, werden die gefundenen Links nicht geändert, sondern nur ausgegeben.

Bei Angabe von -l wird zunächst das Endziel jedes existierenden Links ermittelt, und zwar mit Hilfe der Funktion getlink (diese muss definiert sein). Dieses Ziel wird dann mit dem absoluten Pfad von zielAlt verglichen. Bei Übereinstimmung ersetzt die Funktion das Ziel durch den absoluten Wert von zielNeu.

Ist die Option -p angegeben, werden alle Links geändert, die den Teilstring zielAlt enthalten; dieser wird durch zielNeu ersetzt. Die Ersetzung erfolgt nach bei bash gültigen den Regeln der Expansion ${parameter/pattern/string}: Ist das erste Zeichen in pattern ein #, muss der Suchtext am Anfang des Strings stehen, ist es ein %, muss er am Ende stehen.

Mit der Option -r wird das Verzeichnis rekursiv, d.h. inklusive aller Unterverzeichnisse durchsucht. Ohne die Option bezieht sich die Suche nur auf den direkten Verzeichnisinhalt.

Wenn die Option -t angegeben ist, wird eine Link-Ersetzung nicht durchgeführt, sondern das entsprechende Kommando nur ausgegeben. Auf diese Weise kann zunächst ein Testlauf durchgeführt werden.

Beispiele:

  1. Alle Links im Verzeichnis dir1, die nach /home/dummy/blah zeigen, sollen durch einen Link auf ../ah/oh ersetzt werden.
    chglink dir1 /home/dummy/blah ../ah/oh
    Man beachte, dass hier nur Links geändert werden, die direkt auf das Ziel /home/dummy/blah zeigen.
  2. Alle Links im aktuellen Verzeichnis und in allen Unterverzeichnissen, die physikalisch nach /usr/share/miau.png zeigen, sollen durch einen Link auf den absoluten Wert von neu/wuff.png ersetzt werden.
    chglink -lr . /usr/share/miau.png neu/wuff.png
    Hier werden auch alle Links erfasst, die über beliebig komplizierte Umwege auf /usr/share/miau.png verweisen.
up
Created 2011-08-11 by mopcoge