Retourner aux forums || Retourner au forum
Programmation.shell : Choisir un fichier au hasard dans un répertoire
Posté par Frédéric Heulin () le 06 octobre 2006
0
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 ! :)
> Lire le message (3 commentaires, moyenne: 2,7).
plus simple
Posté par
jjl (page perso, ) le 06/10/2006 à 20:50. (lien). Évalué à 4.
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.
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 Frédéric Heulin () le 06/10/2006 à 21:01. (lien). É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 Krunch (Jabber id, page perso, ) le 07/10/2006 à 20:30. (lien). É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--
Free Softwares Users Group Arlon (Sud Luxembourg, Belgique)
pertinent, e adj. Approprié ; qui se rapporte exactement à ce dont il est question.
-
Revenir en haut de page || Retourner aux forums || Retourner au forum


Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.