HomeSoftwareSpieleMusikForum

Dateipfade normieren und relativieren

Gelegentlich möchte man einen Dateipfad relativ zu einem beliebigen Basisverzeichnis darstellen (nicht unbedingt zum Arbeitsverzeichnis). Dazu kann die Funktion relpath verwandt werden. Beispiel:
path=a/b/c  base=../x/y
pwd                   # Ausgabe: /usr/dumpf
relpath $base $path   # Ausgabe: ../../dumpf/a/b/c
Das Problem ist nicht ganz trivial, denn das Verfahren soll auch in Fällen wie diesen funktionieren:
relpath  ../x/./y   ./a/../a/b/c
Um die Pfade in Beziehung setzen zu können, müssen sie zunächst normiert, d.h. von ..- und .-Komponenten befreit werden. Und auch Dateinamen, die Leerzeichen enthalten - eine gängige Stolperfalle für Shellscripte - sollen korrekt verarbeitet werden.

Die Funktion lässt sich mit einem oder zwei Parametern aufrufen:

relpath path

Der Pfad path wird absolut und in normierter Form ausgegeben.

relpath [-p]base path

Der Pfad path wird relativ zum Verzeichnis base ausgegeben. Beides können absolute oder relative Angaben sein, die nicht im Dateisystem zu existieren brauchen. Der ausgegebene Pfad enthält höchstens am Anfang ..-Komponenten und ist ansonsten normiert.

Wenn beide Pfade gleich sind, wird ohne Option ein Leerstring ausgegeben, mit Option -p ein Punkt.

up
Created 2011-08-11 by mopcoge