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”
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"