Подтвердить что ты не робот

Как преобразовать ".." в именах путей в абсолютное имя в bash script?

Как преобразовать .. в именах путей в абсолютные имена путей в bash script. То есть, если у меня есть путь /home/nohsib/dvc/../bop, я хочу, чтобы это было изменено на путь без точек в нем, в этом случае /home/nohsib/bop

Как я могу это сделать?

4b9b3361

Ответ 1

Что вы ищете, это readlink:

absolute_path=$(readlink -m /home/nohsib/dvc/../bop)

Обратите внимание: вам нужно использовать реализацию GNU readlink, которая предлагает параметр "-m". BSD readlink, например, не делает.

Ответ 2

Try:

ABSOLUTE_PATH=$(cd /home/nohsib/dvc/../bop; pwd)

Ответ 3

Одна проблема с использованием:

ABSOLUTE_PATH=$(cd ${possibleDirectory}; pwd)

заключается в том, что если ${possibleDirectory} не существует, ABSOLUTE_PATH будет установлен в текущий каталог. Это, вероятно, НЕ то, что вы хотите или ожидаете.

Я думаю, что использование этой версии может быть более желательным в целом:

ABSOLUTE_PATH=$(cd ${possibleDirectory} && pwd)

Если ${possibleDirectory} не существует или недоступен, из-за отсутствия разрешений доступа к каталогу, ABSOLUTE_PATH будет содержать пустую строку.

Преимущество этого заключается в том, что вы можете затем проверить пустую строку или позволить ей сбой естественным образом, в зависимости от обстоятельств. По умолчанию текущая директория в случае неудачной команды "cd" может привести к очень неожиданным и, возможно, катастрофическим результатам (например, rm -rf "$ ABSOLUTE_PATH" )

Ответ 4

Если вы хотите сделать это без каких-либо символических ссылок, попробуйте использовать realpath с опцией -s:

$ realpath -s /home/nohsib/dvc/../bop
/home/nohsib/bop

Обратите внимание, что при realpath обычно должен существовать все, кроме последнего компонента. Таким образом, для работы выше, все должны присутствовать в файловой системе:

/home
/home/nohsib
/home/nohsib/dvc

Но вы можете обойти это требование, используя опцию -m.

$ realpath -sm /home/nohsib/dvc/../bop
/home/nohsib/bop

(Примечание realpath недоступно для всех систем, особенно для старых систем, отличных от Debian. Для тех, кто работает во встроенной Linux, к сожалению, Busybox realpath не поддерживает переключатели -s или -m.)

Ответ 5

Использование

echo Absolute path: $(cd $1; pwd)

Ответ 6

Просто добавьте примечание, если ваш текущий путь находится под символической ссылкой, вы можете разрешить истинный путь с помощью этого:

pwd -P

Чтобы решить вашу конкретную проблему, вы получите команду cd, чтобы сменить каталог на путь без ".." в нем. Обратите внимание, что вы будете в одной папке, только с правильным путем:

cd `pwd -P`

Ответ 7

В качестве альтернативы GNU readlink и realpath я также создал функции, которые будут выполняться в сценариях, не зависящих от внешних команд, таких как pwd и stuffs.

http://www.linuxquestions.org/questions/blog/konsolebox-210384/getting-absolute-paths-of-unix-directories-and-filenames-in-shell-scripts-3956/

Один из них - это один. Он сохранит абсолютный путь до $__. Я использовал здесь, чтобы быть уверенным в расширении пути.

function getabspath {
    local -a T1 T2
    local -i I=0
    local IFS=/ A

    case "$1" in
    /*)
        read -r -a T1 <<< "$1"
        ;;
    *)
        read -r -a T1 <<< "/$PWD/$1"
        ;;
    esac

    T2=()

    for A in "${T1[@]}"; do
        case "$A" in
        ..)
            [[ I -ne 0 ]] && unset T2\[--I\]
            continue
            ;;
        .|'')
            continue
            ;;
        esac

        T2[I++]=$A
    done

    case "$1" in
    */)
        [[ I -ne 0 ]] && __="/${T2[*]}/" || __=/
        ;;
    *)
        [[ I -ne 0 ]] && __="/${T2[*]}" || __=/.
        ;;
    esac
}

Ответ 8

одним хорошим решением под оболочкой будет:

readlink -ev mypathname

Он печатает полное имя пути с разрешенными точками.

Ответ 9

Попробуйте это (если ваш относительный путь хранится в переменной $rel_path):

echo "`cd $rel_path; pwd`"