Я ответил на аналогичный вопрос: Разрешение относительного пути без ссылки на текущий каталог в Windows .
Для этого нет стандартной функции. Для этой цели существует функция в vi-like-emac. Быстрая проверка apropos relative
показывает мне несколько других программ, которые, вероятно, реализуют это: revpath , например).
Это может быть сделано как манипуляция строкой (нет необходимости вычислять рабочие каталоги):
« сделано » во второй шаг предполагает, что вы хотите использовать относительный путь для сокращения результата. С другой стороны, вы можете использовать относительный путь, независимо от длины. В этом случае просто пропустите шаг (результат будет длиннее, но relative ).
Найдите самый длинный общий путь (в данном случае, /a/path/to
) и удалите его из обоих абсолютных путей. Это даст:
/a
/somewhere/else
Теперь замените каждый компонент пути в исходном пути на ../
и добавьте результат к пути назначения. Если вы хотите перейти из каталога else
в каталог a
, это даст вам:
../../a
Если вы хотите пойти другим путем, вы должны иметь:
../somewhere/else
Создайте дерево с первым абсолютным путем, затем добавьте второй путь к этому дереву, а затем переходите от одного листа к другому: шаг от одного узла до его родителя переводится в последовательность «../», и шаг от узла к одному из его детей переводится на имя этих детей. Обратите внимание, что может быть несколько решений. Например:
1) /a/path/to/a
И
2) /a/path/to/a/new/one
Очевидный путь от (1) до (2) есть new/one
, но ../../../a/path/to/a/new/one
также верен. Когда вы пишете алгоритм для ходьбы в своем дереве, вы должны знать об этом