Как получить корневой каталог данного пути в 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"
легко настроить регулярное выражение.