web-dev-qa-db-fra.com

Comment obtenir le répertoire racine du chemin donné dans bash?

Mon script:

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

Et maintenant je veux obtenir le premier dossier de "$ PATH":/home /

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

Comment puis-je toujours détecter le premier dossier comme dans l'exemple ci-dessus? "dirname $ PATH" ne fait que renvoyer "/ home/utilisateur/exemple/foo /".

Merci d'avance! :)

10
user2966991

J'ai trouvé une solution:

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

Cela retourne toujours le premier répertoire. Dans cet exemple, il retournerait ce qui suit:

    #home#

Merci à @condorwasabi pour son idée avec awk! :)

17
user2966991

Si PATH a toujours une forme absolue, vous pouvez faire des astuces comme

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

Ou

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

Cependant, je devrais également ajouter à cela qu'il est préférable d'utiliser d'autres variables et de ne pas utiliser PATH car cela modifierait vos répertoires de recherche pour les fichiers binaires, à moins que vous n'en ayez vraiment l'intention.

Vous pouvez également choisir de convertir votre chemin en forme absolue via readlink -f ou readlink -m:

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

Vous pouvez également vous référer à ma fonction getabspath .

6
konsolebox

Vous pouvez essayer cette commande awk: 

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

À ce stade, basedirectory sera la chaîne home Ensuite, vous écrivez:

rm -rf ./"$basedirectory"/
3
condorwasabi

Pour obtenir le premier répertoire:

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

PS: N'utilisez jamais la variable PATH dans votre script car elle remplacera PATH par défaut et votre script ne sera pas en mesure d'exécuter de nombreux utilitaires système

EDIT: Cela devrait probablement fonctionner pour vous:

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

Pure bash:

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

Facile à modifier la regex.

0
Thomazella