Obtener el nombre del directorio actual (sin la ruta completa) en un script Bash

¿Cómo obtendría solo el nombre actual del directorio de trabajo en un script bash, o mejor aún, solo un comando de terminal?

pwd proporciona la ruta completa del directorio de trabajo actual, por ejemplo, /opt/local/bin pero solo quiero bin

No hay necesidad de basename, y especialmente no hay necesidad de una subshell que ejecute pwd (lo que agrega una operación de horquilla extra y costosa ); el shell puede hacer esto internamente usando la expansión de parámetros :

 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. 

Usa el progtwig basename . Para su caso:

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

1.

Puedes usar una combinación de pwd y basename. P.ej

 #!/bin/bash CURRENT=`pwd` BASENAME=`basename "$CURRENT"` echo "$BASENAME" exit; 

¿Qué tal grep:

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

muy simple

 pwd | xargs basename 

Me gusta la respuesta seleccionada (Charles Duffy), pero tenga cuidado si está en un directorio enlazado y quiere el nombre del directorio de destino. Lamentablemente, no creo que se pueda hacer en una sola expresión de expansión de parámetros, quizás estoy equivocado. Esto debería funcionar:

 target_PWD=$(readlink -f .) echo ${target_PWD##*/} 

Para ver esto, un experimento:

 cd foo ln -s . bar echo ${PWD##*/} 

informa “bar”

DIRNAME

Para mostrar los directorios principales de una ruta (sin incurrir en un fork-exec de / usr / bin / dirname):

 echo ${target_PWD%/*} 

Esto, por ejemplo, transformará foo / bar / baz -> foo / bar

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

Si está usando el shell Bourne o ${PWD##*/} no está disponible.

Este hilo es genial! Aquí hay un sabor más:

 pwd | awk -F / '{print $NF}' 

Sorprendentemente, nadie mencionó esta alternativa que usa solo comandos bash integrados:

 i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}" 

Como una ventaja adicional , puede obtener fácilmente el nombre del directorio padre con:

 [ "${#p[@]}" -gt 1 ] && echo "${p[-2]}" 

Estos funcionarán en Bash 4.3-alpha o más nuevo.

 basename $(pwd) 

o

 echo "$(basename $(pwd))" 

Yo suelo usar esto en sh scripts

 SCRIPTSRC=`readlink -f "$0" || echo "$0"` RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` echo "Running from ${RUN_PATH}" ... cd ${RUN_PATH}/subfolder 

puedes usar esto para automatizar cosas …

 basename "$PWD" 

O

 IFS=/ var=($PWD) echo ${var[-1]} 

Gire el Separador de nombre de archivo interno (IFS) de nuevo a un espacio.

 IFS= 

Hay un espacio después del IFS =.

Puede usar la utilidad basename que borra cualquier prefijo que termine en / y el sufijo (si está presente en una cadena) de la cadena, e imprime el resultado en la salida estándar.

 $basename  

Solo usa:

 pwd | xargs basename 

o

 basename "`pwd`" 

Below grep con regex también está funcionando,

 >pwd | grep -o "\w*-*$" 

Para los jinetes de encontrar a alguien como yo:

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

Prefiero usar gbasename , que es parte de GNU coreutils.

Los siguientes comandos darán como resultado la impresión de su directorio de trabajo actual en un script bash.

 pushd . CURRENT_DIR="`cd $1; pwd`" popd echo $CURRENT_DIR 

Yo uso este comando:

dirname "$0"