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

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

--

Il y a 10 types de personnes dans le monde
Ceux qui comprennent le binaire et les autres.

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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]$
    ;-))
    1. 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

      1. Modérateur
        sed 's#.*\\.\\.##;s#[./]*$##'
        en ne laissant qu'un antislash "\" devant les points, mise en forme du forum oblige ;-((

        ;-))
    2. 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
      1. Modérateur
        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]$ 
        ;-))