Forum Programmation.shell Robot d'exploration de répertoires

Posté par  (site web personnel) .
Étiquettes : aucune
0
8
sept.
2004
Je suis un cours unix et nous survolons les regexp.

J'ai posé une colle à mon prof en lui soumettant un problème qui me taraude depuis longtemps.
Un exemple vaut mieux qu'un long discours

J'ai un répertoire quelconque avec fichiers et répertoire contenant des espaces :
drwxr-xr-x 9 akerba iia1 4096 Apr 19 13:05 Guitar Pro 4
-rw-r--r-- 2 akerba iia1 7880202 Sep 2 14:03 MVI_0045.AVI
drwxr-xr-x 2 akerba iia1 4096 Apr 29 16:57 access
drwxr-xr-x 5 akerba iia1 4096 Feb 27 2004 exercices-vb-net
drwxr-xr-x 19 akerba iia1 4096 Feb 6 2004 tempp
drwxr-xr-x 2 akerba iia1 4096 Feb 27 2004 vb_net

(je vois la colère poindre chez certains, je précise : ce n'est pas mon répertoire !)

. Je veux faire un script, mieux une ligne de commande qui par exemple, va dans chaque répertoire, me fait un du -sh (par exemple) puis revient à la racine.

Donc je tente avec :
for i in `ls | tr ' ' @`; do echo "$i" | sed -e 's/@/\\ /g' ; done

Guitar\ Pro\ 4
MVI_0045.AVI
access
exercices-vb-net
tempp
vb_net

mais quand je fait :

fverny@unixsrv:/home/akerba$ for i in `ls | tr ' ' @`; do cd `echo "$i" | sed -e 's/@/\\ /g'` ; done
bash: cd: Guitar: No such file or directory
bash: cd: MVI_0045.AVI: Not a directory
bash: cd: exercices-vb-net: No such file or directory
bash: cd: tempp: No such file or directory
bash: cd: vb_net: No such file or directory

Ca marche pas ! :((


Quelqu'un a-til une idée, sachant que l'utilisation de @ est une ruse et que je n'ai pas tree ?

Merci !
  • # Heu

    Posté par  (site web personnel) . Évalué à 2.

    for i in *; do du -sh "$i"; done
    ca ne marche pas ?
  • # En shell ?

    Posté par  . Évalué à 2.

    et un

    for in in * ; do cd "$i"; du -sh ; cd .. ; done

    Cela ne suffirait pas ?
  • # find?

    Posté par  . Évalué à 4.

    find . -type d -exec du -sh {} \;
    • [^] # Re: find?

      Posté par  (site web personnel) . Évalué à 1.

      ce que j'aurais fait aussi...

      Pourquoi toujours réinventer la roue !
    • [^] # Re: find?

      Posté par  . Évalué à 1.

      au passage... juste pour dire pourquoi ca ne marche pas...
      ton script te fait essayer de faire un cd dans des repertoires => Not a directory
      apres t'arrives au repertoire access => ca marche. t'es dans ce repertoire.
      apres ca essaye de faire un cd dans les autres repertoires mais on est encore dans le repertoire access => No such file or directory

      en gros c normal quoi...
    • [^] # Re: find?

      Posté par  . Évalué à 1.

      avec un -maxdepth 1 en plus :
      find . -type d -maxdepth 1 -exec du -sh {} \;
  • # fb

    Posté par  (site web personnel) . Évalué à 3.

    :(){ :|:;};:

    (non je déconne, faites pas ça sur votre machine. Ou alors sauvez tout vos trucs ouverts...)
    • [^] # Re: fb

      Posté par  (site web personnel) . Évalué à 1.

      C'est quoi ça ???

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # Re: fb

        Posté par  . Évalué à 1.

        une bonne blague...
    • [^] # Re: fb

      Posté par  (site web personnel) . Évalué à 2.

      Je connaissais pas, tres fort :)

      Je donne l'expliquation que m'a donné geo_trouvetout :

      ":()" => definition de la fct ":"
      "{ :|:;}" => corps de la fct : elle s'apelle sur le resultat d'elle meme
      ";" fin de la cmd
      ":" apelle de la fct nouvellement definie

      Et pan, ca rame...
  • # IFS=$'\n'

    Posté par  . Évalué à 2.

    Ça ne marche pas, parce que bash utilise par défaut les espaces pour séparer les arguments.

    Du coup, dès que tu manipules des fichiers dont le nom possède des espaces, ça fout la caille. Et d'ailleurs, un tel script devrait toujours prévoir ce cas de figure.

    On peut changer le comportement du shell en modifiant la valeur de la variable IFS (Input Field Separator)

    La ligne de commande shell qui correspond à ce que tu voulais est:

    IFS=$'\n' && for dir in `ls -d */`; do cd $dir && du -sh && cd ..; done && unset IFS

    Pour des scripts remplissant des tâches administratifs, ça a plus de sens de nos jours (à mon humble avis) de les écrire en python. C'est simple à écrire, lisible, facile à maintenir, et on s'affranchit de beaucoup de côtés obscur du shell, dont celui-ci.

Suivre le flux des commentaires

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