script programacion parametros funciones ejemplos ejecutar directorio con comando bash shell

programacion - Obtenga el nombre del directorio actual(sin ruta completa) en un script Bash



script linux bash (20)

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

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

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

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


¿Qué tal grep:

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


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

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


Me gusta la respuesta seleccionada (Charles Duffy), pero tenga cuidado si se encuentra en un directorio de enlace simbólico y desea el nombre del directorio de destino. Desafortunadamente, no creo que se pueda hacer en una expresión de expansión de un solo parámetro, tal vez me equivoque. Esto debería funcionar:

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

Para ver esto, un experimento:

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

informes de "barra"

Nombre de usuario

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


No se necesita un nombre base, y especialmente no se necesita una subshell que ejecute pwd (lo que agrega una operación de bifurcación adicional 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.

Tenga en cuenta que si está aplicando esta técnica en otras circunstancias (no PWD , sino alguna otra variable que tenga un nombre de directorio), es posible que deba recortar las barras inclinadas al final. A continuación se usa el soporte de baseball de bash para trabajar incluso con múltiples barras diagonales:

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"

Alternativamente, sin extglob :

dirname="/path/to/somewhere//" result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim result=${result##*/} # remove everything before the last /


Para los jinetes encontrar por ahí como yo:

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


Por debajo de grep con expresiones regulares también está trabajando,

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


Puede usar la utilidad de nombre base que elimina cualquier prefijo que termina en / y el sufijo (si está presente en la cadena) de la cadena, e imprime el resultado en la salida estándar.

$basename <path-of-directory>


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

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


Solo usa:

pwd | xargs basename

o

basename "`pwd`"


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

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

Como bono adicional , puede obtener fácilmente el nombre del directorio principal con:

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

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


Usualmente uso esto en scripts sh

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


Utilice el programa de basename . Para su caso:

% basename "$PWD" bin


Yo prefiero usar gbasename , que es parte de los coreutils de GNU.


Yo uso este comando:

dirname "$0"


muy simple

pwd | xargs basename


$ echo "${PWD##*/}"

Al aire libre


basename "$PWD"

O

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

Gire el Separador de nombres de archivos internos (IFS) de nuevo a un espacio.

IFS=

Hay un espacio después de la IFS =.


basename $(pwd)

o

echo "$(basename $(pwd))"


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

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