Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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 ?

10 réponses

1 2
Avatar
rixed
J'ai posté avant de réfléchir, désolé pour le bruit.
Il faut évidement utiliser comme clef l'inode et
l'identifiant du device.

Donc, voilà.
:)
Avatar
Stephane CHAZELAS
2008-06-25, 07:40(+00), :
J'ai posté avant de réfléchir, désolé pour le bruit.
Il faut évidement utiliser comme clef l'inode et
l'identifiant du device.


[...]

Sinon, pour repondre a la question dans l'objet de l'enfilade
(le subject du thread): realpath(3)

--
Stéphane
Avatar
Paul Gaborit
À (at) Wed, 25 Jun 2008 07:53:04 +0000 (UTC),
Stephane CHAZELAS écrivait (wrote):
Sinon, pour repondre a la question dans l'objet de l'enfilade
(le subject du thread): realpath(3)



Je ne connaissais pas cette fonction... mais après avoir vu la doc et
surtout la section "BUGS", je n'en conseillerais pas l'utilisation !

Petit extrait (en français en plus) :

N'utilisez jamais cette fonction. Sa conception est erronée (à moins
d'utiliser la caractéristique non standard resolved_path == NULL)
car elle ne permet pas de connaître la taille nécessaire pour le
tampon de sortie resolved_path. D'après POSIX, un tampon de taille
PATH_MAX suffit, mais PATH_MAX n'est pas nécessairement une
constante définie et peut être obtenue avec pathconf(3). En outre,
interroger pathconf(3) n'aide pas vraiment, car d'une part POSIX
prévient que les résultats de pathconf(3) peuvent être immenses et
inappropriés pour allouer de la mémoire et d'autre part pathconf(3)
peut renvoyer -1 indiquant que PATH_MAX est illimité.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Avatar
Stephane CHAZELAS
2008-06-25, 13:46(+02), Paul Gaborit:

À (at) Wed, 25 Jun 2008 07:53:04 +0000 (UTC),
Stephane CHAZELAS écrivait (wrote):
Sinon, pour repondre a la question dans l'objet de l'enfilade
(le subject du thread): realpath(3)



Je ne connaissais pas cette fonction... mais après avoir vu la doc et
surtout la section "BUGS", je n'en conseillerais pas l'utilisation !

Petit extrait (en français en plus) :

N'utilisez jamais cette fonction. Sa conception est erronée (à moins
d'utiliser la caractéristique non standard resolved_path == NULL)



Cette /caractéristique/ ne sera apparemment plus non-standard
quand la prochaine de version de SUS sortira car elle est dans
le draft courant.

car elle ne permet pas de connaître la taille nécessaire pour le
tampon de sortie resolved_path. D'après POSIX, un tampon de taille
PATH_MAX suffit, mais PATH_MAX n'est pas nécessairement une
constante définie et peut être obtenue avec pathconf(3). En outre,
interroger pathconf(3) n'aide pas vraiment, car d'une part POSIX
prévient que les résultats de pathconf(3) peuvent être immenses et
inappropriés pour allouer de la mémoire et d'autre part pathconf(3)
peut renvoyer -1 indiquant que PATH_MAX est illimité.





--
Stéphane
Avatar
rixed
On 2008-06-25, Paul Gaborit wrote:
D'après POSIX, un tampon de taille
PATH_MAX suffit, mais PATH_MAX n'est pas nécessairement une
constante définie et peut être obtenue avec pathconf(3). En outre,
interroger pathconf(3) n'aide pas vraiment, car d'une part POSIX
prévient que les résultats de pathconf(3) peuvent être immenses et
inappropriés pour allouer de la mémoire et d'autre part pathconf(3)
peut renvoyer -1 indiquant que PATH_MAX est illimité.



On en apprend des choses ! Je me sert tous les jours de PATH_MAX.

J'espère que je ne coderais plus qu'en lisp le jour où PATH_MAX vaudra
quelquechose qui ne tient pas sur la pile :-)

Bon, je ne regrette pas d'avoir posé ma question finalement.
Avatar
Cyrille Lefevre
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.

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 pa s
la solution ultime. Je pourrais aussi remplacer les "/../" par des "/"
mais ça ne règle pas la question des liens symbolique (et c'est lai d).

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 ?





Bonjour,

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

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

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Alain Montfranc
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.

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 ?



Sinon en quick and dirty :

if [ -d $dir }
then
(cd $dir; pwd)
else
echo "No such directory..." >&2
exit 1
fi
Avatar
Matthieu Moy
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)

--
Matthieu
Avatar
fx [François-Xavier Peretmere]
on the 27/06/08 8:37 Matthieu Moy wrote the following:
a écrit :





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.






[...]
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)



Mais x récupère alors la valeur du répertoir courant, non? Ne serait-ce pas
mieux ainsi :

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


Fx

--
"I haven't lost my mind... I have it backed up on tape somewhere."
-Keith Meidling
Avatar
Stephane CHAZELAS
2008-06-27, 11:39(+02), fx [François-Xavier Peretmere]:
[...]
x=$(cd -P "$x"; pwd)

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



Mais x récupère alors la valeur du répertoir courant, non? Ne serait-ce pas
mieux ainsi :

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


[...]

Et encore mieux avec:

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

Le -P n'est en theorie pas necessaire pour "pwd" mais ca rend
les choses plus claires.

Qui ne marche pas si le chemin canonique se termine par des
linefeeds.

--
Stéphane
1 2