316 votes

Obtenir le parent d'un répertoire en Bash

Si j'ai un chemin de fichier tel que...

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

Comment changer la chaîne de caractères pour que ce soit le répertoire parent ?

par exemple

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

4 votes

Vous pouvez simplement utiliser ' .. mais ce n'est peut-être pas ce que vous aviez à l'esprit.

2 votes

' ne peut être utilisé que pour le chemin d'un répertoire et non pour le chemin d'un fichier.

10voto

aiho Points 264

Si vous avez juste besoin du nom du répertoire parent :

parent_dir_name=$(basename $(dirname $PWD))

9voto

Jon Points 4637

Si /home/smith/Desktop/Test/../ est ce que vous voulez :

dirname 'path/to/child/dir'

comme vu aquí .

1 votes

Désolé, je veux dire que dans un bash script, j'ai une variable avec le chemin du fichier

0 votes

L'exécution de ce code me donne l'erreur bash: dirname 'Test': syntax error: invalid arithmetic operator (error token is "'Test'") . Le code lié est également erroné.

0 votes

Essayez juste de courir dirname Test à partir du répertoire Test est dans.

4voto

awregan Points 336

Selon que vous avez besoin ou non de chemins absolus, vous voudrez peut-être faire une démarche supplémentaire :

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

1 votes

Realpath n'est pas posix

0 votes

Bon à savoir. C'est un logiciel faisant partie de gnu core utils qui peut ou non être installé sur votre système.

0voto

Kaustubh Points 490

Utiliser ce : export MYVAR="$(dirname "$(dirname "$(dirname "$(dirname $PWD)")")")" si vous voulez le 4e répertoire parent

export MYVAR="$(dirname "$(dirname "$(dirname $PWD)")")" si vous voulez le 3ème répertoire parent

export MYVAR="$(dirname "$(dirname $PWD)")" si vous voulez le deuxième répertoire parent

0voto

magoofromparis Points 1

Laid mais efficace

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_: /

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X