Скажем, у меня есть два пути: <source_path>
и <target_path>
. Я хотел бы, чтобы моя оболочка (zsh) автоматически выяснила, есть ли способ представить <target_path>
из нее <source_path>
относительный путь.
Например предположим
<source_path>
является/foo/bar/something
<target_path>
является/foo/hello/world
Результат будет ../../hello/world
Зачем мне это нужно:
Мне нужно по возможности создавать символическую ссылку <source_path>
на <target_path>
использование относительной символической ссылки, поскольку в противном случае наш сервер samba не показывает файл должным образом, когда я получаю доступ к этим файлам в сети из Windows (я не являюсь системным администратором, и не не может контролировать эту настройку)
Предполагая, что <target_path>
и <source_path>
являются абсолютными путями, следующее создает символическую ссылку, указывающую на абсолютный путь .
ln -s <target_path> <source_path>
так что это не работает для моих нужд. Мне нужно сделать это для сотен файлов, поэтому я не могу просто исправить это вручную.
Есть встроенные оболочки, которые позаботятся об этом?
symlinks
для преобразования абсолютных ссылок в относительные.Ответы:
Вы можете использовать
symlinks
команду для преобразования абсолютных путей в относительные:У нас есть абсолютные ссылки, давайте конвертируем их в относительные:
Ссылки
источник
Попробуйте использовать
realpath
команду (часть GNUcoreutils
; > = 8.23 ), например:Если вы используете macOS, установите версию GNU через:
brew install coreutils
и используйтеgrealpath
.Обратите внимание, что для успешной работы команды должны существовать оба пути. Если вам все равно нужен относительный путь, даже если один из них не существует, добавьте ключ -m.
Дополнительные примеры см. В разделе « Преобразование абсолютного пути в относительный путь для текущего каталога» .
источник
realpath: unrecognized option '--relative-to=.'
:( RealPath версия 1.19realpath
. Если вы на MacOS, установить с помощью:brew install coreutils
.realpath (GNU coreutils) 8.26
там, где присутствует параметр. См. Gnu.org/software/coreutils/realpath. Дважды проверьте, что вы не используете псевдоним (например, запустить от имени\realpath
), и как вы можете установить версию изcoreutils
.Я думаю, что это решение на python (взято из того же поста, что и ответ @ EvanTeitelman) также стоит упомянуть. Добавьте это к вашему
~/.zshrc
:Затем вы можете сделать, например:
источник
sys.argv
. Если опубликованный код неверен или может быть улучшен, не стесняйтесь сделать это с моей благодарностью.Нет никаких встроенных оболочек, чтобы позаботиться об этом. Я нашел решение по переполнению стека, хотя. Я скопировал здесь решение с небольшими изменениями и пометил этот ответ как вики сообщества.
Вы можете использовать эту функцию так:
источник
Это самое простое и красивое решение проблемы.
Также это должно работать на всех подобных борну оболочках.
И мудрость здесь такова: совершенно не нужны внешние утилиты или даже сложные условия. Пара замен префикса / суффикса и цикл while - это все, что вам нужно, чтобы получить практически все, что происходит в оболочках типа bourne.
Также доступно через PasteBin: http://pastebin.com/CtTfvime
источник
Makefile
мне нужно было добавить пару двойных кавычек в строкуpos=${pos%/*}
(и, конечно, точки с запятой и обратную косую черту в конце каждой строки).relpath /tmp /tmp
,relpath /tmp /tmp/a
,relpath /tmp/a /
. Кроме того, вы забыли упомянуть, что все пути должны быть абсолютными и/tmp/a/..
Мне пришлось написать скрипт bash, чтобы сделать это надежно (и, конечно, без проверки существования файла).
использование
Возвращает относительный исходный путь.
пример:
оба получают
../../CC/DD/EE
Для быстрого теста вы можете запустить
Результат: список тестов
Кстати, если вы хотите использовать этот сценарий без сохранения и доверяете этому сценарию, то у вас есть два способа сделать это с помощью bash trick.
Импортируйте
relpath
как функцию bash, выполнив следующую команду. (Требуется Bash 4+)или вызовите сценарий на лету, как с помощью комбо curl bash.
источник