O pacote "coreutils" padrão do Linux contém um comando realpath
.
Isso seguirá todos os links simbólicos para o caminho nomeado e retornará o caminho "real" associado a ele.
Então:
$ mkdir -p /tmp/foo/bar
$ ln -s /tmp/foo $HOME/foo
$ realpath $HOME/foo
/tmp/foo
$ realpath $HOME/foo/bar
/tmp/foo/bar
$ realpath $HOME/foo/bar/baz
/tmp/foo/bar/baz
Podemos ver que o link $HOME/foo
está sendo substituído pelo caminho real de /tmp/foo
.
A última entrada não precisa existir, mas todos os pontos intermediários devem.
$ realpath $HOME/foo/bar/baz/qux
realpath: '/home/sweh/foo/bar/baz/qux': No such file or directory
Isso porque não há diretório baz
.