Forum Programmation.shell profondeur relative d'un fichier dans une arborescence

Posté par  .
Étiquettes : aucune
0
23
avr.
2008
Bonjour,

Dans ma tentative de créer un script de gestion de site web à base de pages statiques, je cherche une manière de trouver à quelle profondeur dans l'arborescence se trouve un fichier donné. L'intérêt est de transformer automatiquement des liens absolus en liens relatifs, et de supprimer le besoin d'avoir un serveur web qui tourne en local pour développer son site.

Un exemple : la racine de mon site est à /home/utilisateur/site/. En y lançant mon script, une page dans /home/utilisateur/site/ aurait une profondeur de 1, une dans /home/utilisateur/site/linux/ aurait une profondeur de 2, etc. Avec cette information, je peux facilement transformer un lien du type href="/dossier/page.html" en href="dossier/page.html" ou href="../dossier/page.html"

Vous connaissez une manière d'extraire cette information ? tree et find ne m'ont rien donné...
  • # Un peu de perl

    Posté par  . Évalué à 2.

    Si je devais faire ça je procéderai de la manière suivante, avec un ptit bout de perl pour compter les / :

    find ./ -name "*.*" | cut -d"/" -f2- | perl -e 'while(<>) { $l = $_; @arr = split(/\//); $l =~ s/\n//; $cnt = @arr; print $l.":".($cnt - 1)."\n" }'

    Ou find recherche les fichiers,
    cut -d"/" -fX- permet d'enlever la racine
    et derrière un bout de perl qui compte le nombre de / et affiche le chemin relatif, deux points et le niveau
    • [^] # Re: Un peu de perl

      Posté par  . Évalué à 6.

      on peut aussi compter les / à coup de
      tr -c '/' ' ' | tr -d ' ' | wc -c
      • [^] # Re: Un peu de perl

        Posté par  . Évalué à 1.

        +1
        J'avais complètement oublié l'existence de tr... honte sur moi ;)
        • [^] # Re: Un peu de perl

          Posté par  . Évalué à 2.

          ben ouais, c'est le forum programmation.shell quoi ! ;)

          cela dit, je fais le malin, mais il m'a fallu un man tr, vu que je ne connaissais ni l'option -c, ni l'option -d ...

          Du coup, merci pour la question MilkaJinka ;)
      • [^] # Re: Un peu de perl

        Posté par  . Évalué à 1.

        Super le coup de tr, c'est parfaitement ce que je cherchais :-)

        Accessoirement, ça m'a permis de contourner un problème dans une boucle for (en tout cas sous Busybox) : les noms de fichier avec des espaces s'affichaient sur plusieurs lignes, ce qui est problématique pour les traiter :


        for fichier in $(find . -type f)
        do
        echo "$fichier"
        done


        Ce code affichait "./un nom de fichier avec des espaces" comme ceci (alors qu'un find dans la console les affiche correctement) :
        ./un
        nom
        de
        fichier
        avec
        des
        espaces
      • [^] # Re: Un peu de perl

        Posté par  . Évalué à 2.

        et même encore mieux !
        tr -d -c '/' | wc -c
        parce que tr est bien conçu =)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.