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
la source

20 ответов

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 23:27:10
la source

utilisez le programme basename . Pour votre cas:

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

114
répondu DigitalRoss 2015-02-13 14:54:51
la source

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 14:56:18
la source

Que diriez-vous de grep:

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

très simple

pwd | xargs basename
9
répondu Hani Sharabash 2017-08-11 01:31:41
la source

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 18:42:45
la source
echo "$PWD" | sed 's!.*/!!'

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

5
répondu anomal 2014-02-05 05:10:10
la source

ce fil est grand! Voici une saveur de plus:

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

ou

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

é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-04 00:14:30
la source

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 19:52:22
la source
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 04:36:03
la source

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-04 02:05:05
la source

il suffit d'utiliser:

pwd | xargs basename

ou

basename "`pwd`"
0
répondu marcos 2015-02-13 14:40:40
la source

ci-dessous grep avec regex fonctionne aussi,

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

Pour le trouver jockeys là-bas comme moi:

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

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

0
répondu Steve Benner 2017-07-27 18:19:06
la source

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 19:22:27
la source

j'utilise cette commande:

dirname ""151900920""

-4
répondu Jeff Tian 2015-12-10 11:31:53
la source

Autres questions sur bash shell