Как получить корневой каталог данного пути в bash?

мой скрипт:

    #!/usr/bin/env bash
    PATH=/home/user/example/foo/bar
    mkdir -p /tmp/backup$PATH

и теперь я хочу получить первую папку "$PATH": / home/

    cd /tmp/backup
    rm -rf ./home/
    cd - > /dev/null

Как я могу всегда обнаруживать первую папку, как в примере выше? "dirname $PATH" просто возвращает " / home/user/example/foo/".

спасибо заранее! :)

5 ответов


Я нашел решение:

    #/usr/bin/env bash
    DIRECTORY="/home/user/example/foo/bar"
    BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2)
    echo "#$BASE_DIRECTORY#";

Это возвращает всегда первый каталог. В этом примере он вернется следующим образом:

    #home#

спасибо @condorwasabi за его идею с awk! :)


если PATH всегда имеет абсолютную форму, вы можете делать трюки, как

ROOT=${PATH#/} ROOT=/${ROOT%%/*}

или

IFS=/ read -ra T <<< "$PATH"
ROOT=/${T[1]}

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

также вы можете выбрать, чтобы преобразовать ваш путь к абсолютной форме через readlink -f или readlink -m:

ABS=$(readlink -m "$PATH")

вы также можете обратиться к своим обязанностям getabspath.


вы можете попробовать эту команду awk:

 basedirectory=$(echo "$PATH" | awk -F "/" '{print }')

В этот момент basedirectory будет строка дома Потом пишешь:

rm -rf ./"$basedirectory"/

получить первый firectory:

path=/home/user/example/foo/bar
mkdir -p "/tmp/backup$path"
cd /tmp/backup
arr=( */ )
echo "${arr[0]}"

PS: никогда не используйте переменную PATH в своем скрипте, поскольку она переопределит путь по умолчанию, и вы не сможете выполнить многие системные утилиты

EDIT: наверное, это должно работать для вас:

IFS=/ && set -- $path; echo ""
home

Pure bash:

DIR="/home/user/example/foo/bar"
[[ "$DIR" =~ ^[/][^/]+ ]] && printf "$BASH_REMATCH"

легко настроить регулярное выражение.