Come calcolare un percorso relativo da due percorsi assoluti nella shell Linux?


17

Abbiamo due percorsi. La prima è la directory, la seconda una directory o un file.

/a/b/c e /a/d/e.txt

Il percorso relativo dal primo al secondo sarà:

../../d/e.txt

Come calcolarlo nel terminale Linux? Per coloro che chiedono "Cos'è il caso d'uso?" Si potrebbe usare questo, ad esempio, per creare molti link simbolici relativi.


1
Questo non avrebbe dovuto essere migrato.

1
Avrebbe dovuto essere chiuso come duplicato.
In pausa fino a nuovo avviso.

Risposte:


10

Supponendo coreutils GNU:

  • Per i link simbolici, lnha recentemente appreso l' --relativeopzione.

  • Per tutto il resto, realpathsupporta le opzioni --relative-to=e --relative-base=.


1
Come lo fai con BusyBox?
DUzun,

4

Per me, questa risposta (che utilizza un oneliner in pitone) funziona perfettamente.

$ python -c "import os.path; print os.path.relpath('/a/d/e.txt', '/a/b/c')"
../../d/e.txt

Testato con successo su Linux (Kubuntu 14.04) e su Mac OSX, richiede Python 2.6.


2

Per non dipendere da realpathciò che non è costantemente disponibile e minimizzare le dipendenze, ho pensato a questo (usando un piccolo aiuto da questa risposta ):

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}"
}

Genera una subshell per trovare la parte comune di entrambi i percorsi. Forse ti piace, funziona per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.