Wie kann ich redundante Komponenten in einem Pfad eliminieren?Bash: Beseitigung redundanter Pfadkomponenten?
Zum Beispiel würde Ich mag
/foo/../foo/bar
zu
/foo/bar
Wie kann ich redundante Komponenten in einem Pfad eliminieren?Bash: Beseitigung redundanter Pfadkomponenten?
Zum Beispiel würde Ich mag
/foo/../foo/bar
zu
/foo/bar
Mit gnu realpath
zu transformieren:
p='/foo/../foo/bar'
realpath -m "$p"
Ausgang:
/foo/bar
Per realpath --help
:
-m, --canonicalize-missing no components of the path need exist
Sie können auch häufiger verfügbar readlink
(dank @pjh) verwenden:
readlink -m "$p"
Sie könnten Rohr durch so etwas wie: sed ' s -/../foo/-/- g 'zum Ersetzen von Hoch/Runter-Referenzen in Pfadnamen.
das wird seit 'etc/bar /../ foo /! = Etc/bar' nicht funktionieren – karakfa
Siehe [Wie normalisieren Sie einen Dateipfad in Bash?] (Http://stackoverflow.com/q/284662/4154375). – pjh
Beachten Sie, dass auf Unix-ähnlichen Systemen, die symbolische Links unterstützen, '/X/../Y' nicht immer mit '/ Y' identisch ist. In dem Beispiel in dieser Frage, wenn Sie die Verzeichnisse '/ bar/foo/bar' und '/ bar/qux/bar' haben und '/ foo' ein Symlink zu '/ bar/qux' ist, dann '/ foo/../foo/bar 'ist eigentlich'/bar/foo/bar 'und'/foo/bar 'ist eigentlich'/bar/qux/bar '. Alle Lösungsversuche, die nur textuelle Substitutionen auf Pfaden durchführen, sind falsch. (Aber es ist in Ordnung, so etwas unter Windows zu machen, weil ".." dort etwas anderes bedeutet.) – pjh