Respuestas:
Parece que quieres el nombre base del nombre del directorio:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
comando asumirá que está en el directorio actual (también conocido como ".").
parentname="$(basename "$(dirname "$pwd")")"
PWD
deben escribirse en mayúscula Tratar parentname="$(basename "$(dirname "$PWD")")"
.
Puede usar pwd para obtener el directorio de trabajo actual y usar la expansión de parámetros para evitar bifurcarlo en otro (sub) shell.
echo ${PWD##*/}
Editar: fuente probada
${path##*/}
Creo que esta es una solución con menos recursos:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
editar: Lo sentimos, la expansión anidada no es posible en bash, pero funciona en zsh. Versión Bash:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
o filepath = / file`.
foofile
? Si no está completa, la ruta no se puede saber (tal vez si foofile
es un archivo existente, no solo una "cadena").
En bash, en una línea:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
Me gusta más la respuesta de Julian67, pero aquí hay una versión un poco ampliada:
file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;') # cut away "/a/b/c/"
echo $parent # --> you get "d"