2011-12-08 13 views
112

Si tengo una ruta de archivo como ...recibiendo el padre de un directorio en el Bash

/home/smith/Desktop/Test 
/home/smith/Desktop/Test/ 

¿Cómo cambio la cadena por lo que será el directorio padre?

p. Ej.

+1

Usted puede simplemente utilizar ''..'', pero tal vez eso no es exactamente lo que tenía en mente. –

Respuesta

161
dir=/home/smith/Desktop/Test 
parentdir="$(dirname "$dir")" 

Funciona si hay una barra inclinada, también.

+9

las comillas en el interior son importantes o va a perder todos sus datos – asdfasdfads

+4

y la variante que estoy usando para obtener el padre del directorio de trabajo actual: 'parentdir = $ (dirname \' pwd \ ')' – TheGrimmScientist

+0

El padre del directorio de trabajo actual es simplemente '..'. –

7

Si /home/smith/Desktop/Test/../ es lo que quiere:

dirname 'path/to/child/dir' 

como se ve here.

+1

lo siento, me refiero a como un script bash, tengo una variable con la ruta del archivo – YTKColumba

+0

Al ejecutar ese código me da el error 'bash: dirname 'Test': error de sintaxis: operador aritmético no válido (token de error es" 'Test' ") '. El código vinculado también es incorrecto. –

+0

intente ejecutar 'dirname Test' del directorio' Test'. – Jon

11

... pero lo que es "visto here" está roto. Aquí está la solución:

> pwd 
/home/me 
> x='Om Namah Shivaya' 
> mkdir "$x" && cd "$x" 
/home/me/Om Namah Shivaya 
> parentdir="$(dirname "$(pwd)")" 
> echo $parentdir 
/home/me 
1

Dependiendo de si se necesita rutas absolutas es posible que desee dar un paso más:

child='/home/smith/Desktop/Test/' 
parent=$(dirname "$child") 
abs_parent=$(realpath "$parent") 
-1

uso esto: export MYVAR="$(dirname "$(dirname "$(dirname "$(dirname $PWD)")")")" si quieres directorio cuarta matriz

export MYVAR="$(dirname "$(dirname "$(dirname $PWD)")")" si quiere el tercer directorio principal

export MYVAR="$(dirname "$(dirname $PWD)")" si quiere el segundo directorio principal

2

Simplemente use echo $(cd ../ && pwd) mientras trabaja en el directorio cuyo directorio padre desea encontrar. Esta cadena también tiene la ventaja adicional de no tener barras inclinadas.

+0

No necesita 'echo' aquí. –

5

Es evidente que el directorio padre se da simplemente añadiendo el punto-punto nombre del archivo:

/home/smith/Desktop/Test/..  # unresolved path 

Pero hay que querer el resuelto ruta (una ruta absoluta sin ningún componente del camino del punto-punto):

/home/smith/Desktop    # resolved path 

El problema con las respuestas más que utilizan dirname, es que no funcionan cuando se introduce una ruta con punto-puntos:

$ 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=`eval "cd $dir;pwd;cd - > /dev/null"` 

se puede alimentar /home/smith/Desktop/Test/.., sino también los caminos más complejos como:

$ dir=~/Library/../Desktop/../.. 
$ parentdir=`eval "cd $dir;pwd;cd - > /dev/null"` 
$ echo $parentdir 
/Users         # the fully resolved path! 
0

feo pero eficiente

function Parentdir() 

{

local lookFor_ parent_ switch_ i_ 

lookFor_="$1" 

#if it is not a file, we need the grand parent 
[ -f "$lookFor_" ] || switch_="/.." 

#length of search string 
i_="${#lookFor_}" 

#remove string one by one until it make sens for the system 
while [ "$i_" -ge 0 ] && [ ! -d "${lookFor_:0:$i_}" ]; 
do 
    let i_-- 
done 

#get real path 
parent_="$(realpath "${lookFor_:0:$i_}$switch_")" 

#done 
echo " 
lookFor_: $1 
{lookFor_:0:$i_}: ${lookFor_:0:$i_} 
realpath {lookFor_:0:$i_}: $(realpath ${lookFor_:0:$i_}) 
parent_: $parent_ 
" 

}

lookFor_: /home/Om Namah Shivaya 
{lookFor_:0:6}: /home/ 
realpath {lookFor_:0:6}: /home 
parent_: /home 


lookFor_: /var/log 
{lookFor_:0:8}: /var/log 
realpath {lookFor_:0:8}: /UNIONFS/var/log 
parent_: /UNIONFS/var 


lookFor_: /var/log/ 
{lookFor_:0:9}: /var/log/ 
realpath {lookFor_:0:9}: /UNIONFS/var/log 
parent_: /UNIONFS/var 


lookFor_: /tmp//res.log/.. 
{lookFor_:0:6}: /tmp// 
realpath {lookFor_:0:6}: /tmp 
parent_:/


lookFor_: /media/sdc8/../sdc8/Debian_Master//a 
{lookFor_:0:35}: /media/sdc8/../sdc8/Debian_Master// 
realpath {lookFor_:0:35}: /media/sdc8/Debian_Master 
parent_: /media/sdc8 


lookFor_: /media/sdc8//Debian_Master/../Debian_Master/a 
{lookFor_:0:44}: /media/sdc8//Debian_Master/../Debian_Master/ 
realpath {lookFor_:0:44}: /media/sdc8/Debian_Master 
parent_: /media/sdc8 


lookFor_: /media/sdc8/Debian_Master/../Debian_Master/For_Debian 
{lookFor_:0:53}: /media/sdc8/Debian_Master/../Debian_Master/For_Debian 
realpath {lookFor_:0:53}: /media/sdc8/Debian_Master/For_Debian 
parent_: /media/sdc8/Debian_Master 


lookFor_: /tmp/../res.log 
{lookFor_:0:8}: /tmp/../ 
realpath {lookFor_:0:8}:/
parent_:/
Cuestiones relacionadas