Como calcular um caminho relativo de dois caminhos absolutos no shell do Linux?

17

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.

    
por techraf 13.05.2010 / 05:56

3 respostas

10

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= .

por 14.10.2014 / 09:15
4

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.

    
por 14.10.2014 / 12:30
1

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.

    
por 14.11.2017 / 12:42