2015-05-25 6 views
5

Ich bin auf der Suche nach einer Möglichkeit zur Normalisierung beliebiger Dateipfade in Bash, Auflösung . und .. auf ihre absoluten Werte. Beispiele:Normalize beliebige Dateipfade in bash auf OSX

> cd /foo/bar 
> normalize_path "." 
/foo/bar 
> normalize_path "../baz" 
/foo/baz 
> normalize_path "../../folder/that/doesnt/exist/" 
/folder/that/doesnt/exist 

Beachten Sie, wie in den obigen Beispielen, normalize_path einen Wert zurückgibt auch wenn der Weg zu einem echten Ordner nicht entspricht oder Datei. Alle vorherigen Fragen über absolute oder normalisierte Pfade, die ich auf StackOverflow (example 1, example 2) gesehen habe, nehmen an, dass der Pfad auf eine reale Datei zeigt und realpath oder pwd zu normalisieren, aber das wird nicht für meinen Anwendungsfall funktionieren.

Mit anderen Worten, ich bin auf der Suche nach einer Bash-Funktion, die Pfade als Strings rein manipuliert und nicht tatsächlich auf das Dateisystem, ähnlich File.getCanonicalPath in Java.

+3

Muss es ausschließlich in 'bash' sein oder könntest du' readlink -m your_imaginary_path_here' oder 'realpath -m your_imaginary_path_here' verwenden? – rickhg12hs

+0

@ rickhg12hs: Ich bin auf der Suche nach etwas, das auf OS X läuft. –

Antwort

4

Readlink ist der Weg zu gehen, oder in Ihrem Fall greadlink. Es ist im GNU Core Utilities Paket. "brew install coreutils" (wenn Sie selbstgebraut verwenden). Dann benutze greadlink -m ../my_silly_filename.txt wie rickhg12hs sagte.

+0

Ah, ich wusste nicht, 'greadlink' hatte einen' -m' Parameter! Ich hatte '-f' versucht, wie es in vielen anderen Antworten vorgeschlagen wurde, und es funktioniert nicht, wenn die Datei nicht existiert. Aber '-m', AKA'cannonicalize-missing' macht genau das, was ich will. Vielen Dank! –