Transformer "/foo/../bar" en "/bar&

santiago69 Messages postés 485 Statut Membre -  
jipicy Messages postés 41342 Statut Modérateur -
salut a tous,
existe-t-il une fonction pour obtenir un chemin d'acces "propre" a partir de n'importe quelle adresse. Par exemple :
/foo/../bar/    ->  /bar/
/foo/.          ->  /foo/

Merci d'avance
Santiago

A voir également:

4 réponses

jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

Un truc du genre :
[tmpfs]$ echo -e "$A\n$B\n$C\n$D"
/foo/../bar/
/foo/.
/foo/bar
/foo/../../../bar/beau

[tmpfs]$ echo -e "$A\n$B\n$C\n$D" | sed 's#\(.*/\).*#\1#;s#.*\(/.*/$\)#\1#'
/bar/
/foo/
/foo/
/bar/

[tmpfs]$
;-))
0
santiago69 Messages postés 485 Statut Membre 209
 
Interessant mais ca ne marche pas du tout 8-) Les chemins "propres" devraient etre :
/foo/../bar/            ->  /bar
/foo/.                  ->  /foo
/foo/bar                ->  /foo/bar
/foo/../../../bar/beau  ->  /bar/beau

J'ai eu une proposition interessante sur un autre forum https://www.unix.com/
$ path='/foo/bar/../beau'
$ path=$(cd "$path"; pwd)
$ echo path
/foo/beau

0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
sed 's#.*\\.\\.##;s#[./]*$##'
en ne laissant qu'un antislash "\" devant les points, mise en forme du forum oblige ;-((

;-))
0
santiago69 Messages postés 485 Statut Membre 209
 
Ca ne marche toujours pas chez moi :o(
Pourtant j'ai enleve les double \.

Mais j'ai trouve deux solution :
readlink qui est de base dans ma distribution (debian 4.0)
realpath que j'ai installe avec aptitude
$ readlink -e /foo/../bar///beau/
/bar/beau
$ realpath /foo/../bar///beau/
/bar/beau

realpath offre l'avantage de pouvoir suivre ou pas les liens symboliques (-s pour ne pas suivre) et de pouvoir resoudre plusieurs chemins a la fois (en les separant pas des /000 avec -z)

Merci quand meme. D'ailleurs, je ne comprends rien a cette syntaxe de sed.
Santiago
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Ben chez moi elle marche ma syntaxe :
[tmpfs]$ echo -e "$A\n$B\n$C\n$D" | sed 's#.*\\.\\.##;s#/.*$##'
/bar
/foo
/foo/bar
/bar/beau
[tmpfs]$ 
;-))
0