Obtenir le nom du répertoire courant (sans chemin complet) dans un script Bash
Comment pourrais-je obtenir juste le nom courant du répertoire de travail dans un script bash, ou encore mieux, juste une commande de terminal.
pwd
donne le chemin complet du répertoire courant, par exemple /opt/local/bin
mais je veux seulement bin
20 réponses
pas besoin de basename, et surtout pas besoin d'un pwd subshell tournant (qui ajoute une opération à la fourche supplémentaire et coûteuse ); le shell peut le faire en interne en utilisant parameter expansion :
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.
vous pouvez utiliser une combinaison de pwd et de basename. Par exemple:
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
j'aime la réponse choisie (Charles Duffy), mais faites attention si vous êtes dans un dir symlinked et vous voulez le nom de la cible dir. Malheureusement, je ne pense pas que cela puisse être fait dans une seule expression d'extension de paramètre, peut-être que je me trompe. 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 une fourche-exec de /usr/bin/dirname):
echo ${target_PWD%/*}
cela transformera par exemple foo / bar/ baz - > foo /bar
echo "$PWD" | sed 's!.*/!!'
si vous utilisez Bourne shell ou ${PWD##*/}
n'est pas disponible.
ce fil est grand! Voici une saveur de plus:
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]}"
comme 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.
j'ai l'habitude d'utiliser ce sh scripts
SCRIPTSRC=`readlink -f ""151900920"" || echo ""151900920""`
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]}
retournez le séparateur de nom de fichier interne (IFS) dans un espace.
IFS=
il y a un espace après les Fi= .
vous pouvez utiliser l'utilitaire basename qui supprime tout préfixe se terminant dans / et le suffixe (si présent dans string) à partir de string, et imprime le résultat sur la sortie standard.
$basename <path-of-directory>
ci-dessous grep avec regex fonctionne aussi,
>pwd | grep -o "\w*-*$"
Pour le trouver jockeys 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 vous permettront d'imprimer votre répertoire courant dans un script bash.
pushd .
CURRENT_DIR="`cd ; pwd`"
popd
echo $CURRENT_DIR