Як обчислити відносний шлях з двох абсолютних шляхів у оболонці Linux?


17

У нас дві стежки. Перший - це каталог, другий - каталог або файл.

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

Відносний шлях від першого шляху до другого буде:

../../d/e.txt

Як обчислити це в терміналі Linux? Для тих, хто запитує "Що таке випадок використання?", Можна скористатися цим, наприклад, для створення безлічі відносних посилань.


1
Це не повинно було мігрувати.

1
Він повинен був бути закритим як дублікат.
Призупинено до подальшого повідомлення.

Відповіді:


10

Якщо припустити основні програми GNU:

  • Для посилань, lnнещодавно дізнався --relativeваріант.

  • Для всього іншого, realpathпідтримує варіанти --relative-to=та --relative-base=.


1
Як це робити з BusyBox?
Дзузун

4

Для мене ця відповідь (яка використовує пітон oneliner) працює ідеально.

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

Тестується успішно на Linux (Kubuntu 14.04) та на Mac OSX, потрібен Python 2.6.


2

Щоб не залежати від того, realpathщо це не є доступним, і мінімізувати залежності, я придумав це (скориставшись невеликою допомогою у цій відповіді ):

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

Породжує нижню частину для пошуку спільної частини обох патчів. Можливо, вам це подобається - працює для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.