[Vienna-pm] Pfad säubern

Stefan Weiss spaceman at foo.at
Fri Jul 8 07:32:47 PDT 2005


Hi.

Gibt es eine schöne Methode, um (Unix-)Pfade in eine Art Minimalform
überzuführen, also zB "foo/../bar" -> "bar"? Die Zieldatei (bzw
Verzeichnis) muss nicht unbedingt existieren.

Ich habe den Anfang von einer Schleife, die das erledigen könnte, aber
zusätzlich zu einem Fehler (s.u.) bin ich nicht mehr sicher, ob ich das
ganze überhaupt richtig angehe, oder ob ich dabei nicht irgendwelche
Schlupflöcher übersehen habe:

--------------------------------------------------------------------
my $url = "/../foo/bar/blomm/../..//baz/./blimm/../..";
print "original: $url\n";
if ($url =~ m#/#) {
    for (;;) {
        $_ = $url;
        s#/+#/#g;           # foo//bar -> foo/bar
        s#/\./#/#g;         # foo/./bar -> foo/bar
        s#^/(\.\./)+#/#;    # /../../foo -> /foo
        s#(.)/+$#$1#;       # foo/ -> foo
        s#[^/]+/\.\./##;    # foo/../bar -> bar   *FIXME*
        print "   end of s###: $_\n";
        last if ($_ eq $url);
        $url = $_;
    }
}
print "final: $url\n";
--------------------------------------------------------------------

Die Zeile mit dem *FIXME* soll unnötige "/../"-Teile eliminieren, aber
erstens wird im Moment noch "../../.." auf ".." geändert, und zweitens
bleiben das "/.." am Ende noch stehen. Ich bin noch nicht sicher, wie
ich das angehen soll (ersetze "foo/../bar" durch "bar", wobei "foo"
nicht ".." sein darf).

Bevor ich weiterbastel:
Darf man Pfade überhaupt so vereinfachen?
Habe ich etwas wichtiges übersehen?


cheers,
stefan


More information about the Vienna-pm mailing list