Obtenir le nom du répertoire actuel (sans chemin d’access complet) dans un script Bash

Comment puis-je obtenir juste le nom du répertoire de travail actuel dans un script bash, ou même mieux, juste une commande de terminal.

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

Pas besoin de nom de base, et surtout pas besoin d’un sous-shell exécutant pwd (ce qui ajoute une opération fourchette supplémentaire et coûteuse ); le shell peut le faire en interne en utilisant l’ extension 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. 

Utilisez le programme de nom de base. Pour votre cas:

 % basename "$PWD" bin 
 $ echo "${PWD##*/}" 

Vous pouvez utiliser une combinaison de pwd et de nom de base. Par exemple

 #!/bin/bash CURRENT=`pwd` BASENAME=`basename "$CURRENT"` echo "$BASENAME" exit; 

Que diriez-vous de grep:

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

très simple

 pwd | xargs basename 

J’aime la réponse sélectionnée (Charles Duffy), mais faites attention si vous êtes dans un répertoire avec 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’extension à un seul paramètre, je me trompe peut-être. Cela devrait fonctionner:

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

Pour voir ceci, une expérience:

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

rapports “bar”

DIRNAME

Pour afficher les principaux répertoires d’un chemin (sans encourir fork-exec de / usr / bin / dirname):

 echo ${target_PWD%/*} 

Cela va par exemple transformer foo / bar / baz -> foo / bar

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

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

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

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

Étonnamment, personne n’a mentionné cette alternative qui utilise uniquement des commandes bash intégrées:

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

En prime, vous pouvez facilement obtenir le nom du répertoire parent avec:

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

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

 basename $(pwd) 

ou

 echo "$(basename $(pwd))" 

j’utilise habituellement ceci dans des scripts sh

 SCRIPTSRC=`readlink -f "$0" || echo "$0"` RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` echo "Running from ${RUN_PATH}" ... cd ${RUN_PATH}/subfolder 

vous pouvez l’utiliser pour automatiser les choses …

 basename "$PWD" 

OU

 IFS=/ var=($PWD) echo ${var[-1]} 

Retourner le séparateur de nom de fichier interne (IFS) dans un espace.

 IFS= 

Il y a un espace après l’IFS =.

Vous pouvez utiliser l’utilitaire basename qui supprime tout préfixe se terminant par / et le suffixe (s’il est présent dans ssortingng) de la chaîne et affiche le résultat sur la sortie standard.

 $basename  

Utilisez simplement:

 pwd | xargs basename 

ou

 basename "`pwd`" 

En dessous de grep avec regex fonctionne également,

 >pwd | grep -o "\w*-*$" 

Pour les jockeys trouver là-bas comme moi:

 find $PWD -maxdepth 0 -printf "%f\n" 

Je préfère fortement utiliser gbasename , qui fait partie de GNU coreutils.

Les commandes suivantes entraînent l’impression de votre répertoire de travail actuel dans un script bash.

 pushd . CURRENT_DIR="`cd $1; pwd`" popd echo $CURRENT_DIR 

J’utilise cette commande:

dirname "$0"