Programmation.shell : profondeur relative d'un fichier dans une arborescence
Posté par MilkaJinka () le 23 avril 2008Bonjour,
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é...
> Lire le message (6 commentaires, moyenne: 2,3).
Vous avez demandé le commentaire #925080.



Un peu de perl
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
on peut aussi compter les / à coup de
tr -c '/' ' ' | tr -d ' ' | wc -c[^]Re: Un peu de perl
+1
J'avais complètement oublié l'existence de tr... honte sur moi ;)
[^]Re: Un peu de perl
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
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
Persiste.
[^]Re: Un peu de perl
et même encore mieux !
tr -d -c '/' | wc -c
parce que tr est bien conçu =)