Obtener el padre de un directorio en Bash
Si tengo una ruta de archivo como...
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
¿Cómo cambio la cadena para que sea el directorio principal?
p.ej
/home/smith/Desktop
/home/smith/Desktop/
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"
También funciona si hay una barra diagonal.
Claramente, el directorio principal se obtiene simplemente agregando el nombre del archivo punto-punto:
/home/smith/Desktop/Test/.. # unresolved path
Pero debes querer la ruta resuelta (una ruta absoluta sin ningún componente de ruta punto-punto):
/home/smith/Desktop # resolved path
El problema con las respuestas principales que usan dirname
es que no funcionan cuando ingresas una ruta con punto-punto:
$ dir=~/Library/../Desktop/../..
$ parentdir="$(dirname "$dir")"
$ echo $parentdir
/Users/username/Library/../Desktop/.. # not fully resolved
Esto es más poderoso :
dir=/home/smith/Desktop/Test
parentdir=$(builtin cd $dir; pwd)
Puedes alimentarlo /home/smith/Desktop/Test/..
, pero también rutas más complejas como:
$ dir=~/Library/../Desktop/../..
$ parentdir=$(builtin cd $dir; pwd)
$ echo $parentdir
/Users # the fully resolved path!
NOTA: el uso de builtin
garantiza que no se llame a ninguna variante de función definida por el usuario cd
, sino al formulario de utilidad predeterminado que no tiene salida.
Simplemente utilícelo echo $(cd ../ && pwd)
mientras trabaja en el directorio cuyo directorio principal desea averiguar. Esta cadena también tiene el beneficio adicional de no tener barras al final.