Forum Programmation.shell Choisir un fichier au hasard dans un répertoire

Posté par  .
Étiquettes : aucune
0
6
oct.
2006
Voilà ma problématique :
- je lance mlterm en utilisant l'option -p pour changer l'image de fond du terminal
- j'ai un répertoire d'image qui va bien. Les images ont un nom quelconque et je ne veux pas changer ça.
- je cherche simplement à choisir de façon aléatoire un nom d'image dans mon répertoire de manière à avoir un affichage sympa et varié.

En utilisant find, $RANDOM, grep et deux trois autres outils GNU, j'en suis arrivé à cette solution ... que je trouve laide ! :

mclient -f green -s false -w 12 -p `find /home/talineo/.fehbg_img/ -type f -maxdepth 1 | grep -n "" | grep "^\`expr $RANDOM % \\\`find /home/talineo/.fehbg_img/ -type f -maxdepth 1\\\` + 1\`:" | cut -d ":" -f 2` &

Bon évidemment j'ai placé sur différentes lignes par dépit mais je cherche à faire plus compact.
L'explication de ce pavé :
- j'affiche un liste des fichiers à la racine du répertoire d'image (le premier find)
- je numérote le tout (grep -n "")
- je choisis un numéro en fesant un grep sur $RANDOM modulo le nombre d'image dans le repertoire d'image (find ... | wc -l)
- et enfin je récupère le nomdu fichier dans l'entrée sélectionné (cut)
- ouf ...

Je suis sur qu'il y a beaucoup plus simple mais là je sèche un peu ...
J'ai tenté d'utiliser les tee, redirections sans grand succès pour ne pas faire le find plusieurs fois notamment.
Sinon je me dis que awk pourrait remplir cette tache mais j'avoue mettre plus penché sur sed pour le moment.
ou alors perl ou alors la solution simple limpide que je n'ai pas vu ! :)
  • # plus simple

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

    Je pense que ce script ne marchera qu'avec bash :
    #!/bin/bash
    array=(`ls /images`)
    echo ${array[$(expr $RANDOM % ${#array[@]})]}

    en deux mots :
    * array est un tableau contenant la liste des images
    * ${#array[@]} est la taille de ce tableau
    * $(expr $RANDOM % ${#array[@]}) : est un nombre aleatoire modulo cette taille

    Cela ne fonctionnera pas avec les fichiers qui ont un espace dans leur nom.
    • [^] # Re: plus simple

      Posté par  . Évalué à 2.

      Ce qui donne donc :
      mlterm -p `imgs=(\`find ~/.fehbg_img/ -maxdepth 1 -type f\`) && echo ${imgs[$(expr $RANDOM % ${#imgs[@]})]}`

      effectivement bien plus simple :)
      Merci.
      • [^] # Re: plus simple

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

        Par contre cette méthode ne fonctionnera plus quand il y a trop de fichiers car le `find` va s'étendre en un truc trop long pour le shell. De plus les guillemets inverses (accents graves ?) imbriqués c'est pas très joli. Personnellement j'utiliserais plus quelque chose comme ceci :
        $ mlterm -p `find . -maxdepth 1 -type f | perl -ne'rand$.<1and$r=$_;END{print$r}'`
        http://linuxfr.org/forums/19/3252.html#465225

        pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

Suivre le flux des commentaires

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