web-dev-qa-db-fra.com

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

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

736
Derek Dahmer

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 /
999
Charles Duffy

Utilisez le programme basename . Pour votre cas:

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

Un séjour sans faille

129
DigitalRoss

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

#!/bin/bash

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

echo "$BASENAME"

exit;
23
mbelos

Que diriez-vous de grep:

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

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"

DIRNAME

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

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

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

7
anomal

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

pwd | awk -F / '{print $NF}'
6
rodvlopes
basename $(pwd)

ou

echo "$(basename $(pwd))"
4
user3278975

É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.

4
Arton Dorneles

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 ...

3
Dutch Glory

Pour les Jockeys trouver comme moi:

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

Ci-dessous, grep with regex fonctionne également,

>pwd | grep -o "\w*-*$"
1
Abhishek Gurjar
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 =.

1
FireInTheSky

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

0
Steve Benner

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>
0
niks_4143

Il suffit d'utiliser:

pwd | xargs basename

ou

basename "`pwd`"
0
marcos