Comment pourrais-je obtenir juste le nom du répertoire de travail actuel dans un script bash, ou mieux, juste une commande de terminal.
pwd
donne le chemin complet du répertoire de travail actuel, par exemple. /opt/local/bin
mais je veux seulement bin
Pas besoin de nom de base, et surtout pas besoin de sous-shell exécutant pwd (qui ajoute une opération supplémentaire et coûteuse, fork ); le shell peut le faire en interne en utilisant expansion des paramètres :
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.
Notez que si vous appliquez cette technique dans d'autres circonstances (pas PWD
, mais une autre variable contenant un nom de répertoire), vous devrez peut-être supprimer les barres obliques de fin. Le paragraphe ci-dessous utilise le support d'extglob de bash pour fonctionner même avec plusieurs barres obliques de fin:
dirname=/path/to/somewhere//
shopt -s extglob # enable +(...) glob syntax
result=${dirname%%+(/)} # trim however many trailing slashes exist
result=${result##*/} # remove everything before the last / that still remains
printf '%s\n' "$result"
Sinon, sans extglob
:
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}" # remove everything before the last /
Utilisez le programme basename
. Pour votre cas:
% basename "$PWD"
bin
$ echo "${PWD##*/}"
Un séjour sans faille
Vous pouvez utiliser une combinaison de pwd et basename. Par exemple.
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
Que diriez-vous de grep:
pwd | grep -o '[^/]*$'
J'aime la réponse choisie (Charles Duffy), mais faites attention si vous êtes dans un répertoire lié symboliquement et que vous souhaitez connaître le nom du répertoire cible. Malheureusement, je ne pense pas que cela puisse être fait avec une expression d'expansion à 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##*/}
rapports "bar"
Pour afficher les principaux répertoires d’un chemin (sans exécuter un 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 Bourne Shell ou ${PWD##*/}
n'est pas disponible.
Ce fil est génial! Voici une autre saveur:
pwd | awk -F / '{print $NF}'
basename $(pwd)
ou
echo "$(basename $(pwd))"
Étonnamment, personne n'a mentionné cette alternative qui utilise uniquement 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.
j'utilise habituellement cela dans les 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 des choses ...
Pour les Jockeys trouver comme moi:
find $PWD -maxdepth 0 -printf "%f\n"
Ci-dessous, grep with regex fonctionne également,
>pwd | grep -o "\w*-*$"
basename "$PWD"
OU
IFS=/
var=($PWD)
echo ${var[-1]}
Tournez le séparateur de nom de fichier interne (IFS) dans un espace.
IFS=
Il y a un espace après l'IFS =.
Je préfère fortement utiliser gbasename
, qui fait partie de GNU coreutils.
Vous pouvez utiliser l'utilitaire basename qui supprime tout préfixe se terminant par/et le suffixe (s'il est présent dans string) de string, et affiche le résultat sur la sortie standard.
$basename <path-of-directory>
Il suffit d'utiliser:
pwd | xargs basename
ou
basename "`pwd`"