2015-05-25 8 views
5

Sto cercando un modo per normalizzare i percorsi di file arbitrari in bash, risolvendo . e .. ai loro valori assoluti. Esempi:Normalizza percorsi file arbitrari in bash su OSX

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

notare come negli esempi precedenti, normalize_path restituisce un valore anche se il percorso non corrisponde a una cartella o un file vero e proprio. Tutte le domande precedenti sui percorsi assoluti o normalizzati che ho visto su StackOverflow (example 1, example 2) presuppongono che il percorso punti a un file reale e utilizzino realpath o pwd per normalizzarlo, ma ciò non funzionerà per il mio caso d'uso.

In altre parole, sto cercando una funzione di bash che manipoli puramente i percorsi come stringhe e in realtà non guardi il file system, simile a File.getCanonicalPath in Java.

+3

Deve essere solo in 'bash' oppure si può usare' readlink -m your_imaginary_path_here' o 'realpath -m your_imaginary_path_here'? – rickhg12hs

+0

@ rickhg12hs: Sto cercando qualcosa che gira su OS X. –

risposta

4

Readlink è la strada da percorrere, o nel tuo caso greadlink. È nel pacchetto di utilità di base GNU. "brew install coreutils" (se usi home-brew). Quindi usa greadlink -m ../my_silly_filename.txt come ha detto rickhg12hs.

+0

Ah, non sapevo che 'greadlink' avesse un parametro' -m'! Avevo provato '-f' come suggerito in molte altre risposte, e non funziona se il file non esiste. Ma '-m', AKA' --canonicalize-missing' fa esattamente quello che voglio. Grazie! –