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


17

Nós temos dois caminhos. O primeiro é o diretório, depois o diretório ou o 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 é caso de uso?”, Pode-se usar isso - por exemplo - para criar muitos links simbólicos relativos.


1
Isso não deveria ter sido migrado.

1
Deveria ter sido fechado como duplicado.
Pausado até novo aviso.

Respostas:


10

Assumindo os coreutils do GNU:

  • Para links simbólicos, lnaprendeu recentemente a --relativeopção.

  • Para todo o resto, realpathsuporta opções --relative-to=e --relative-base=.


1
Como você faz isso com o BusyBox?
DUzun

4

Para mim, essa resposta (que usa um python oneliner) 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.


2

Para não depender realpathdaquilo que não está disponível de maneira consistente e minimizar as dependências, eu vim com isso (usando uma pequena ajuda desta 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\1.*/\1/')
  # 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}"
}

Cria um subshell para encontrar a parte comum de ambos os pathes. Talvez você goste - funciona para mim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.