2015-05-25 18 views
5

Szukam sposobu na znormalizowanie dowolnych ścieżek plików w bashu, rozdzielenie . i .. na ich wartości bezwzględne. Przykłady:Znormalizowanie dowolnych ścieżek plików w bashie na OSX

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

zauważyć, jak w powyższych przykładach, normalize_path zwraca wartość nawet jeśli ścieżka nie odpowiadają rzeczywistym folderu lub pliku. Wszystkie poprzednie pytania dotyczące bezwzględnych lub znormalizowanych ścieżek, które widziałem na StackOverflow (example 1, example 2) zakładają ścieżkę do prawdziwego pliku i używają realpath lub pwd do znormalizowania go, ale to nie zadziała w moim przypadku użycia.

Innymi słowy, szukam funkcji basha, która po prostu manipuluje ścieżkami jako łańcuchami i faktycznie nie patrzy na system plików, podobnie jak File.getCanonicalPath w Javie.

+3

Musi to być wyłącznie w 'bash' lub może użyć' readlink -m your_imaginary_path_here' lub 'realpath -m your_imaginary_path_here'? – rickhg12hs

+0

@ rickhg12hs: Szukam czegoś, co działa na OS X. –

Odpowiedz

4

Readlink jest do zrobienia, lub w twoim przypadku greadlink. Jest w głównym pakiecie narzędzi GNU. "brew install coreutils" (jeśli używasz domowego parzenia). Następnie użyj greadlink -m ../my_silly_filename.txt jak powiedział rickhg12hs.

+0

Ah, nie wiedziałem, że 'greadlink' ma parametr' -m'! Próbowałem '-f', jak zasugerowano w wielu innych odpowiedziach, i to nie działa, jeśli plik nie istnieje. Ale '-m', AKA' --canonicalize-missing' robi dokładnie to, czego chcę. Dzięki! –