Obtener el padre de un directorio en Bash

Resuelto YTKColumba asked hace 13 años • 14 respuestas

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/
YTKColumba avatar Dec 08 '11 11:12 YTKColumba
Aceptado
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"

También funciona si hay una barra diagonal.

Michael Hoffman avatar Dec 08 '2011 04:12 Michael Hoffman

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

Rian Rizvi avatar Mar 22 '2017 15:03 Rian Rizvi

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.

Endu A-d avatar Dec 28 '2016 11:12 Endu A-d