Question Obtenir le nom du répertoire actuel (sans le chemin d'accès complet) dans un script Bash


Comment obtenir le nom du répertoire de travail actuel dans un script bash, ou mieux encore, juste une commande de terminal.

pwd donne le chemin complet du répertoire de travail actuel, par ex. /opt/local/bin mais je ne veux que bin


616
2017-09-03 03:11


origine


Réponses:


Pas besoin de basename, et surtout pas besoin d'un sous-shell exécutant pwd (qui ajoute une opération de fourche supplémentaire et coûteuse) la coque peut le faire en interne en utilisant expansion de paramètre:

result=${PWD##*/}          # to assign to a variable

printf '%s\n' "${PWD##*/}" # to print to stdout
                           # ...more robust than echo for unusual names
                           #    (consider a directory named -e or -n)

printf '%q\n' "${PWD##*/}" # to print to stdout, quoted for use as shell input
                           # ...useful to make hidden characters readable.

860
2017-09-03 03:21



Utilisez le basename programme. Pour votre cas:

% basename "$PWD"
bin

190
2017-09-03 03:13



$ echo "${PWD##*/}"

Les


110
2017-09-03 03:23



Vous pouvez utiliser une combinaison de pwd et basename. Par exemple.

#!/bin/bash

CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`

echo "$BASENAME"

exit;

20
2017-09-03 03:20



Que diriez-vous de grep:

pwd | grep -o '[^/]*$'

10
2018-03-03 19:31



très simple

pwd | xargs basename

8
2017-08-10 22:31



J'aime la réponse sélectionnée (Charles Duffy), mais attention si vous êtes dans un répertoire avec un lien symbolique et que vous voulez le nom du répertoire cible. Malheureusement, je ne pense pas que cela puisse être fait dans une expression d'expansion de paramètre unique, peut-être que je me trompe. Cela devrait fonctionner:

target_PWD=$(readlink -f .)
echo ${target_PWD##*/}

Pour voir cela, une expérience:

cd foo
ln -s . bar
echo ${PWD##*/}

signale "barre"

DIRNAME

Pour afficher les principaux répertoires d'un chemin (sans générer un fork-exec de / usr / bin / dirname):

echo ${target_PWD%/*}

Cela va par exemple. transformez foo / bar / baz -> foo / bar


6
2018-04-04 04:16



echo "$PWD" | sed 's!.*/!!'

Si vous utilisez Bourne shell ou ${PWD##*/} n'est pas disponible.


5
2018-05-30 23:46



Ce fil est génial! Voici une autre saveur:

pwd | awk -F / '{print $NF}'

4
2018-03-27 13:32



Étonnamment, personne n'a mentionné cette alternative qui utilise seulement les commandes bash intégrées:

i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"

En tant que bonus ajouté vous pouvez facilement obtenir le nom du répertoire parent avec:

[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"

Ceux-ci fonctionneront sur Bash 4.3-alpha ou plus récent.


3
2018-03-03 20:26