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.