2016-04-05 2 views
1

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 
+0

Siehe [Wie normalisieren Sie einen Dateipfad in Bash?] (Http://stackoverflow.com/q/284662/4154375). – pjh

+0

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

Antwort

2

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" 
+2

Diese Antwort ist gut, aber beachte, dass 'readlink' dasselbe tut und häufiger verfügbar ist. – pjh

+1

Danke @pjh, ich habe es in meiner Antwort hinzugefügt. – anubhava

+0

Readlink funktioniert nur auf Symlinks, ist das richtig? –

0

Sie könnten Rohr durch so etwas wie: sed ' s -/../foo/-/- g 'zum Ersetzen von Hoch/Runter-Referenzen in Pfadnamen.

+1

das wird seit 'etc/bar /../ foo /! = Etc/bar' nicht funktionieren – karakfa