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

647
demandé sur codeforester 2009-09-03 07:11:53

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.
886
répondu Charles Duffy 2014-04-18 19:27:10

utilisez le programme basename . Pour votre cas:

% basename "$PWD"
bin
198
répondu Arkady 2018-08-17 12:45:49
$ echo "${PWD##*/}"

114
répondu DigitalRoss 2015-02-13 11:54:51

vous pouvez utiliser une combinaison de pwd et de basename. Par exemple:

#!/bin/bash

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

echo "$BASENAME"

exit;
21
répondu mbelos 2015-02-13 11:56:18

Que diriez-vous de grep:

pwd | grep -o '[^/]*$'
11
répondu Orange 2016-03-03 19:31:10

très simple

pwd | xargs basename
9
répondu Hani Sharabash 2017-08-10 22:31:41

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

7
répondu FDS 2013-04-23 14:42:45
echo "$PWD" | sed 's!.*/!!'

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

5
répondu anomal 2014-02-05 01:10:10

ce fil est grand! Voici une saveur de plus:

pwd | awk -F / '{print $NF}'
4
répondu rodvlopes 2013-03-27 13:32:21
basename $(pwd)

ou

echo "$(basename $(pwd))"
3
répondu user3278975 2014-02-06 10:05:52

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

3
répondu Arton Dorneles 2016-03-03 21:14:30

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

2
répondu Dutch Glory 2016-10-01 16:52:22
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= .

1
répondu FireInTheSky 2018-06-01 01:36:03

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>
0
répondu niks_4143 2013-10-03 22:05:05

il suffit d'utiliser:

pwd | xargs basename

ou

basename "`pwd`"
0
répondu marcos 2015-02-13 11:40:40

ci-dessous grep avec regex fonctionne aussi,

>pwd | grep -o "\w*-*$"
0
répondu Abhishek Gurjar 2017-04-06 03:03:37

Pour le trouver jockeys là-bas comme moi:

find $PWD -maxdepth 0 -printf "%f\n"
0
répondu user2208522 2017-04-10 18:13:40

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

0
répondu Steve Benner 2017-07-27 15:19:06

les commandes suivantes vous permettront d'imprimer votre répertoire courant dans un script bash.

pushd .
CURRENT_DIR="`cd ; pwd`"
popd
echo $CURRENT_DIR
-1
répondu Paul Sabou 2012-05-17 15:22:27

j'utilise cette commande:

dirname ""151900920""

-4
répondu Jeff Tian 2015-12-10 08:31:53