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:
- 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.
-
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.
|