Assumindo os coreutils GNU:
-
Para links simbólicos,
ln
aprendeu recentemente a opção--relative
. -
Para todo o resto,
realpath
suporta as opções--relative-to=
e--relative-base=
.
Nós temos dois caminhos. O primeiro é o diretório, segundo um diretório ou um arquivo.
/a/b/c
e /a/d/e.txt
O caminho relativo do primeiro caminho para o segundo será:
../../d/e.txt
Como calcular isso no terminal Linux? Para quem pergunta "O que é o caso de uso?", Pode-se usar isso, por exemplo, para criar muitos links simbólicos relativos.
Assumindo os coreutils GNU:
Para links simbólicos, ln
aprendeu recentemente a opção --relative
.
Para todo o resto, realpath
suporta as opções --relative-to=
e --relative-base=
.
Para mim, esta resposta (que usa um oneliner python) funciona perfeitamente.
$ python -c "import os.path; print os.path.relpath('/a/d/e.txt', '/a/b/c')"
../../d/e.txt
Testado com sucesso no linux (Kubuntu 14.04) e no Mac OSX, precisa do Python 2.6.
Para não depender de realpath
que não está disponível de forma consistente e minimizar as dependências, eu criei isso (usando uma pequena ajuda de esta resposta ):
function relative_path_from_to() {
# strip trailing slashes
path1=${1%\/}
path2=${2%\/}
# common part of both paths
common=$(printf '%s\x0%s' "${path1}" "${path2}" | sed 's/\(.*\).*\x0.*//')
# how many directories we have to go up to the common part
up=$(grep -o "/" <<< ${path1#$common} | wc -l)
# create a prefix in the form of ../../ ...
prefix=""; for ((i=0; i<=$up; i++)); do prefix="$prefix../"; done
# return prefix plus second path without common
printf "$prefix${2#$common}"
}
Gera um subshell para encontrar a parte comum de ambos os caminhos. Talvez você goste - funciona para mim.
Tags command-line linux shell path