OVH Cloud OVH Cloud

Obtenir le nom "canonique" d'un répertoire

17 réponses
Avatar
rixed
Bonjour !

Dans un programme (en C) j'aimerai pouvoir reconnaître si deux noms
de répertoires sont en fait les mêmes répertoires.

Par exemple, reconnaitre que "/usr/bin" et "/usr/../usr/bin" sont le
même répertoire.

Je pourrais regarder l'inode, mais il me semble que les inodes sont
uniques par systèmes de fichier uniquement, donc ce n'est surement pas
la solution ultime. Je pourrais aussi remplacer les "/../" par des "/"
mais ça ne règle pas la question des liens symbolique (et c'est laid).

Je me demandais s'il n'y avait pas un truc bien connu, genre un appel
système, pour résoudre ce problème. Qu'en dites vous ?

7 réponses

1 2
Avatar
Matthieu Moy
Stephane CHAZELAS writes:

x=$(cd -P -- "${x:?}" && pwd -P)



Tiens, en expérimentant, je remarque ça :

$ bash -c 'cd -P // && pwd -P'
//
$ dash -c 'cd -P // && pwd -P'
/

C'est un bug de bash ?

--
Matthieu
Avatar
Stephane CHAZELAS
2008-06-27, 13:50(+02), Matthieu Moy:
Stephane CHAZELAS writes:

x=$(cd -P -- "${x:?}" && pwd -P)



Tiens, en expérimentant, je remarque ça :

$ bash -c 'cd -P // && pwd -P'
//
$ dash -c 'cd -P // && pwd -P'
/

C'est un bug de bash ?



Les chemins commencant par "//" peuvent etre speciaux. cd //
n'est pas garanti d'etre la meme chose que cd / d'apres POSIX.
Le comportement de bash est probablement acceptable. Une
application (un script) POSIX ne devrait pas faire de cd //.

--
Stéphane
Avatar
Alain Montfranc
Matthieu Moy a écrit
Cyrille Lefevre <cyrille.lefevre-news%
writes:

a écrit :
Bonjour !

Dans un programme (en C) j'aimerai pouvoir reconnaître si deux noms
de répertoires sont en fait les mêmes répertoires.

Par exemple, reconnaitre que "/usr/bin" et "/usr/../usr/bin" sont le
même répertoire.
[...]



Bonjour,

il y a longtemps, j'ai écrit ça :)

http://groups.google.com/group/fr.comp.os.unix/browse_thread/thread/f2f459eb567b8044/6fc4708d29845bd6?lnk=st&q=#6fc4708d29845bd6



Moi, je fais ça à coups de

x=$(cd -P "$x"; pwd)

(qui ne marche pas si "$x" n'existe pas ou n'est pas un répertoire)



Qui ne marche pas forcément dans le cas de liens symboliques (ne marche
pas sous cygwin par exemple)
Avatar
Stephane CHAZELAS
2008-06-27, 21:06(+02), Alain Montfranc:
[...]
x=$(cd -P "$x"; pwd)

(qui ne marche pas si "$x" n'existe pas ou n'est pas un répertoire)



Qui ne marche pas forcément dans le cas de liens symboliques (ne marche
pas sous cygwin par exemple)



Peux-tu donner un exemple?

--
Stéphane
Avatar
Alain Montfranc
Stephane CHAZELAS a écrit
2008-06-27, 21:06(+02), Alain Montfranc:
[...]
x=$(cd -P "$x"; pwd)

(qui ne marche pas si "$x" n'existe pas ou n'est pas un répertoire)



Qui ne marche pas forcément dans le cas de liens symboliques (ne marche
pas sous cygwin par exemple)



Peux-tu donner un exemple?



Voili :

#pwd
/root
# ln -s /tmp zobi
# cd zobi
# pwd
/root/zobi

(idem avez cd zobi/ ou cd zobi/.)
Avatar
Stephane CHAZELAS
2008-06-27, 22:18(+02), Alain Montfranc:
Stephane CHAZELAS a écrit
2008-06-27, 21:06(+02), Alain Montfranc:
[...]
x=$(cd -P "$x"; pwd)

(qui ne marche pas si "$x" n'existe pas ou n'est pas un répertoire)



Qui ne marche pas forcément dans le cas de liens symboliques (ne marche
pas sous cygwin par exemple)



Peux-tu donner un exemple?



Voili :

#pwd
/root
# ln -s /tmp zobi
# cd zobi
# pwd
/root/zobi

(idem avez cd zobi/ ou cd zobi/.)


[...]

D'ou le "-P". Essaie avec cd -P.

--
Stéphane
Avatar
Alain Montfranc
Stephane CHAZELAS a écrit
2008-06-27, 22:18(+02), Alain Montfranc:
Stephane CHAZELAS a écrit
2008-06-27, 21:06(+02), Alain Montfranc:
[...]
x=$(cd -P "$x"; pwd)

(qui ne marche pas si "$x" n'existe pas ou n'est pas un répertoire)



Qui ne marche pas forcément dans le cas de liens symboliques (ne marche
pas sous cygwin par exemple)



Peux-tu donner un exemple?



Voili :

#pwd
/root
# ln -s /tmp zobi
# cd zobi
# pwd
/root/zobi

(idem avez cd zobi/ ou cd zobi/.)


[...]

D'ou le "-P". Essaie avec cd -P.



Super je connaissais pas ;-)
1 2