Форум Академгородка, Новосибирск > Относительный путь к файлу/директории
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Относительный путь к файлу/директории
Форум Академгородка, Новосибирск > Компьютеры и сети > Операционные системы > Unix
Zebooka
Какой командой можно получить относительный путь из одной директории к другому файлу/директории?

Например, из директории /a/b/c к файлу /a/d/e/f.txt путь будет таким - ../../d/e/f.txt
Sere]\[ka
а не легче использовать абсолютный путь? Для чего такая спецефическая задача?
Таранум
Цитата(Sere]\[ka @ 12.05.2010, 21:18) *
а не легче использовать абсолютный путь? Для чего такая спецефическая задача?
При перемещении или изменении директории структура зависимых файлов не нарушается.
Zebooka
Цитата(Sere]\[ka @ 12.05.2010, 21:18) *

а не легче использовать абсолютный путь? Для чего такая спецефическая задача?

Таранум выше написал smile.gif
Пример использования - создание относительных симлинков. Причем часто и в больших количествах.

Gort
команды нет, но скриптик несложно соорудить
Double-V
Если кто соорудит скриптик, выложите, пожалуйста. Я чувствую, это может когда-нибудь пригодиться smile.gif
milfoil
На баше получилось так.
Код
#!/bin/bash

dir=$1
IFS=/

for d in $(pwd)
do
    [ -z "$d" ] && continue
    echo "$dir" | grep "^/$d" > /dev/null && dir=$(echo "$dir" | sed "s@^/$d@@") || dir=../$dir
done

[ -z "$dir" ] && echo ./ || echo "$dir" | sed 's@//@/@g;s@^/@@'

Zebooka
Пораскинул немного мозгами и сделал такой вариант:
(из плюсов - пути могут не существовать, нормализуются, симлинки не резолвятся)

Код
#!/bin/bash

if [ -z "$1" -o -z "$2" ]; then
    echo "$(basename "$0"): No FROM and/or TO path(s)." >&2
    echo "Usage: " >&2
    echo " $(basename "$0") from_path to_path" >&2
    exit 1
fi

FROM="$(realpath -s "$1")"
TO="$(realpath -s "$2")"
HEAD="$FROM"
LUP=""
while [ "$(echo "$TO/" | grep "^$HEAD/")" != "$TO/" -a "$HEAD" != "/" ]; do
    HEAD="$(dirname "$HEAD")"
    LUP="../$LUP"
done
if [ -z "$LUP" ]; then LUP="./"; fi
TAIL="$(echo "$TO" | sed "s|^$HEAD||" | sed 's|^/||')"
echo "${LUP}${TAIL}"
exit 0
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.