#1 Le 20/07/2010, à 15:29
- Aldian
[Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Bonjour
Je pense que le sujet de mon message doit être parlant, j'ai un baladeur mp3 de 4 GB que je souhaiterai remplir aléatoirement en tapant dans un stock d'environ 12 Go de fichier de taille moyenne 5 Mo (mais pouvant aller jusqu'à 120Mo pour quelques raretés). Pour faciliter les choses, tous les fichiers sont dans le même répertoire.
Je sais qu'il est possible d'utiliser /dev/urandom pour générer des nombres aléatoires, reste à trouver comment attribuer un nombre à chaque fichier et faire en sorte que le tirage soit sans remise. J'aurais bien quelques idées de type script shell de type usine à gaz niveau débutant, mais je me suis dit que sans doute parmi vous certains connaitraient une façon astucieuse de faire les choses
Dernière modification par Aldian (Le 20/07/2010, à 22:44)
Hors ligne
#2 Le 20/07/2010, à 15:37
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Est-ce que chaque morceau de musique doit avoir la même probabilité d'être utilisé, ou cette probabilité doit dépendre de sa taille (plus gros => plus de chances d'être pris)?
Red flashing lights. I bet they mean something.
Hors ligne
#3 Le 20/07/2010, à 15:52
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Non je dirai que la probabilité d'être pris devrait être indépendante de la taille du fichier. Et bien sûr on n'est pas obligé de tomber pile poile sur 4 Go, on n'est pas à 50 Mo près.
Hors ligne
#4 Le 20/07/2010, à 15:58
- Tenshy
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
pour avoir un équivalent de leur donner un numéro, tu fais un ls que tu rediriges dans un fichier, tu auras un fichier par ligne et après tu prends un nombre aléatoire qui te donnera une ligne du fichier
Hors ligne
#5 Le 20/07/2010, à 16:04
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Tous les fichiers sont dans un même dossier (éventuellement dans des sous-dossiers)?
Red flashing lights. I bet they mean something.
Hors ligne
#6 Le 20/07/2010, à 16:08
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Tenshy: Comment évites-tu les doublons? Tu supprimes les lignes dans le fichier au fur et à mesure?
ǤƦƯƝƬ: Tous les fichiers sont dans un seul dossier, pas de sous dossier, mon lecteur ne sait pas les gérer.
Hors ligne
#7 Le 20/07/2010, à 16:10
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Ah, j'oubliais: est-ce qu'il y a d'autres types de fichiers? Du genre images, texte, vidéos..
Red flashing lights. I bet they mean something.
Hors ligne
#8 Le 20/07/2010, à 16:12
- Tenshy
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
oui ca me semble pas mal de supprimer la ligne pour éviter les doublons, tout du moins c'est la solution la plus simple qui me vient en tête.
Hors ligne
#9 Le 20/07/2010, à 17:04
- kamui57
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
J'ai pas fini, mais je vais poster ce que j'ai pour le moment (j'ai trainé au stage pour ton script...:P)
#!/bin/bash
# bash obligé pour "expr"
# on fait la liste des fichiers dans le repertoire
ls -l /media/docsWin/Musique/Butterfly\ Tea/The\ HEAVENz\ BUTTERFLIEz\ \(37883\)/ > butterfly-ls-l.txt
# on ne garde que la liste des fichiers musicaux (les miens sont en ogg) en supprimant les autres fichiers et la ligne donnant le total au dessus
# dans une v2 on pourrait étudier le total pour avertir si le total est plus petit que la taille du baladeur a remplir
grep -i '.ogg' < butterfly-ls-l.txt > testbutterfly.txt
# on compte les fichiers musicaux pour ensuite tirer un nombre aleatoire ayant pour max ce nombre
NB_MUSIQUES=`wc -l < testbutterfly.txt`
echo "Nombre de musiques au depart : $NB_MUSIQUES"
# on tire un nombre entre 0 et NB_MUSIQUES (ouais faudrait que je change pour mettre entre 1 et NB_MUSIQUES)
r=$RANDOM
num=`expr ${r} % ${NB_MUSIQUES}`
echo $num
# on supprime la num-ième ligne du fichier en gardant l'original en testbutterfly.bak
sed "${num}d" -i.bak testbutterfly.txt
Quand le dernier arbre aura été abattu, et le dernier animal exterminé, les hommes se rendront compte que l'argent ne se mange pas (proverbe indien)
Toshiba Satellite L655 4 Go RAM, Archlinux Gnome-shell,LXDE / W7
Toshiba Satellite M30 512 Mo RAM, Archlinux Gnome 3 restreint / Crunchbang LXDE
https://help.ubuntu.com/community/Pastebinit pour poster du texte sur internet en console
Hors ligne
#10 Le 20/07/2010, à 17:06
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Tenshy: merci de ton aide
ǤƦƯƝƬ :non, il n'y a que du mp3.
Etendre l'affaire aux images/vidéos intéresserait peut être des gens, mais pas moi.
edit: Merci kamui57, je n'avais pas vu ton post, je vais regarder .
Dernière modification par Aldian (Le 20/07/2010, à 17:08)
Hors ligne
#11 Le 20/07/2010, à 18:26
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
kamui57 pourquoi passer par des fichiers et non des variables ?
donner un nombre de mp3 ne répond pas à la demande initiale qui parle d'avoir des mp3 jusqu'a 4go.
il faut donc copier les fichiers un à un comme dans votre exemple et comparer la taille du dossier recevant les mp3 par rapport à la taille max.
# boucle lisant les mp3 1 par 1
while read mp3
do
# Taille du fichier de destination : doit y avoir un moyen de squizzer le tail...
taille=$(du -c dossier_copie | tail -1)
# verifie que la taille du dossier est inferieur à 4go approximativement
if [[ ${taille} -lt 4000000 ]]
then
# si c'est vrai, on copie le fichier
cp "${mp3}" dossier_copie
else
# on arrete le script
break
# envoie du retour de la recherche de mp3 suivit du mélange de ceux ci dans la boucle
done < <(find /adresse/mp3 -iname *.mp3 | sort -R)
voila en gros ce que je ferais...
Dernière modification par Hizoka (Le 20/07/2010, à 18:28)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 20/07/2010, à 18:52
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Sauf qu'en passant par une variable, les sauts de ligne disparaissent.
Red flashing lights. I bet they mean something.
Hors ligne
#13 Le 20/07/2010, à 18:59
- kamui57
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Le fichier c'est pour avoir la liste des mp3 que je n'ai pas tiré au sort
j'avais oublié que la fonction du donnait la taille...
dommage que j'ai pas vu ton message avant.
Je poste quand même : http://pastebin.com/04DhjGSk
Même si mon bash est nettement moins bon que le tien... La dernière ligne, j'y aurais jamais pensé. Je crois que je vais te le piquer rien que pour l'exemple
Quand le dernier arbre aura été abattu, et le dernier animal exterminé, les hommes se rendront compte que l'argent ne se mange pas (proverbe indien)
Toshiba Satellite L655 4 Go RAM, Archlinux Gnome-shell,LXDE / W7
Toshiba Satellite M30 512 Mo RAM, Archlinux Gnome 3 restreint / Crunchbang LXDE
https://help.ubuntu.com/community/Pastebinit pour poster du texte sur internet en console
Hors ligne
#14 Le 20/07/2010, à 19:19
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
@Hizoka:
Ah mais en fait je viens de comprendre. Ça roxxe ton truc
Red flashing lights. I bet they mean something.
Hors ligne
#15 Le 20/07/2010, à 19:57
- Totor
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
@Hizoka:
1.find /adresse/mp3 -iname *.mp3
protège ton astérix car il est interprété par le shell en premier et le résultat peut être erroné : le motif doit être interprété par find et non par le shell.
find /adresse/mp3 -iname '*.mp3'
Aussi, utilise -type f pour ne pas sélectionner les dossiers (ce serait dommage de copier un dossier complet ).
2.du -c dossier_copie | tail -1
je pense que stat t'évitera d'utiliser tail (jamais fait sur un dossier et je peux pas tester).
3. il manque un fi
Enfin, me concernant, j'aurais une autre approche : plutôt que de vérifier la taille du dossier destination, je vérifierai si il reste suffisamment de place sur la clef pour y copier le fichier et s'il n'y a pas assez de place, je passe au suivant (quitte à faire une passe sur tous les fichiers). En effet, cela permet de ne pas être dépendant de la taille de la clef et de remplir un max la clef (le fichier actuel peut faire 120Mo et le suivant 3Mo alors qu'il reste 60Mo !)
-- Lucid Lynx --
Hors ligne
#16 Le 20/07/2010, à 20:11
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Hizoka:
Merci beaucoup de ta contribution . Je savais que si je tombais sur quelqu'un de ton calibre, il y aurait moyen de trouver une solution élégante. Pourrais tu s'il te plait commenter la signification de la dernière ligne? Car j'ai testé ton script en remplaçant en dur les adresses (pour l'instant car après je compte les passer en paramètre), et c'est cette ligne qui fait planter, j'ai l'erreur
./Hizoka.sh: line 17: Erreur de syntaxe près du symbole inattendu « done »
kamui57:
Merci d'avoir posté, ton code ressemble beaucoup plus à ce que j'aurais fait (mais en mieux). Du coup j'ai plus de facilités à débugger : http://pastebin.com/8Kiqieek (oui maintenant vous connaissez ma radio favorite et la provenance de mes mp3 ). En fait il y avait ça et là des guillemets en trop ou qui manquaient, c'est selon, donc j'ai corrigé ce qu'il fallait, j'ai testé, et ça marche
Hors ligne
#17 Le 20/07/2010, à 20:22
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
@Aldian:
Corrige le script en ajoutant un "fi" après le "break".
Au fait, c'est "exit" et pas "break", que j'aurais mis. Non?
Edit:
Pourtant, la méthode qui consiste à mettre les fichiers dans le désordre et à les prendre un par un dans la liste obtenue est, je pense, plus propre que le fait de tirer à chaque fois un nombre aléatoire.
Dernière modification par ǤƦƯƝƬ (Le 20/07/2010, à 20:25)
Red flashing lights. I bet they mean something.
Hors ligne
#18 Le 20/07/2010, à 20:52
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
ǤƦƯƝƬ : merci, mais maintenant j'ai une autre erreur au niveau du test conditionnel. Apparemment ça vient du fait que:
$ du -c /media/USB\ DISK/ | tail -1
64 total
et le "total" doit pas être prévu dans les comptes, je suppose?
Si ça marche comme en java, le break et le exit sont équivalents dans ce cas de figure, puisqu'il n'y a pas d'instructions après la fin de la boucle.
Dernière modification par Aldian (Le 20/07/2010, à 20:55)
Hors ligne
#19 Le 20/07/2010, à 21:06
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Essaie avec:
du -s /media/USB\ DISK |awk '{print $1}'
Ça donne la taille totale occupée.
Sinon, avec "df" et "grep", on peut retrouver l'espace dispo sur ta clef USB.
Red flashing lights. I bet they mean something.
Hors ligne
#20 Le 20/07/2010, à 22:26
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
trop fort le totor (toujours... grrr )
donc oui mon code deconne un chouille je l'ai fait à l'arrache...
revoila le code qui devrait être fonctionnel en suivant vos remarques
entree="dossier des mp3"
sortie="dossier du lecteur mp3"
# boucle lisant les mp3 1 par 1
while read mp3
do
# Taille du fichier de destination
taille=$(du -s "${sortie}")
taille=${taille%%??${sortie}}
# verifie que la taille du dossier est inferieur à 4go approximativement à adapter à la bonne taille
if [[ ${taille} -lt 4000000 ]]
then
# si c'est vrai, on copie le fichier
cp "${mp3}" "${sortie}"
else
# on arrête la boucle, ou "exit" pour quitter le script....
break
fi
# envoie du retour de la recherche de mp3 suivit du mélange de ceux ci dans la boucle
done < <(find "${entree}" -type f -iname '*.mp3' | sort -R)
2.du -c dossier_copie | tail -1
je pense que stat t'évitera d'utiliser tail (jamais fait sur un dossier et je peux pas tester).
ne marche pas sur les dossiers...
Enfin, me concernant, j'aurais une autre approche : plutôt que de vérifier la taille du dossier destination, je vérifierai si il reste suffisamment de place sur la clef pour y copier le fichier et s'il n'y a pas assez de place, je passe au suivant (quitte à faire une passe sur tous les fichiers). En effet, cela permet de ne pas être dépendant de la taille de la clef et de remplir un max la clef (le fichier actuel peut faire 120Mo et le suivant 3Mo alors qu'il reste 60Mo !)
l'idée est bonne mais t'imagines, il faut qu'il se taper les 8 autres go juste pour voir si on peut encore caser un petit mp3...
Dernière modification par Hizoka (Le 20/07/2010, à 23:07)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#21 Le 20/07/2010, à 22:33
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Merci bien, grâce à tes indications, le script d'Hizoka est désormais fonctionnel. Voici le code final avec les corrections:
#
SOURCE="$1"
DESTINATON="$2"
# boucle lisant les mp3 1 par 1
while read mp3
do
# Taille du fichier de destination : doit y avoir un moyen de squizzer le tail...
taille=$(du -s "$DESTINATON" |awk '{print $1}')
echo ${taille}
# verifie que la taille du dossier est inferieur à 4go approximativement
if [[ ${taille} -lt 4000000 ]]
then
# si c'est vrai, on copie le fichier
cp "${mp3}" "$DESTINATON"
else
# on arrete le script
break
fi
# envoie du retour de la recherche de mp3 suivit du mélange de ceux ci dans la boucle
done < <(find "$SOURCE" -iname '*.mp3' | sort -R)
Passons maintenant aux performances. Sur un échantillon de 2000 Mo (chronomètre en main):
Hizoka : 10m20s25
kamui57 : 5m49s53
Je pense que le script d'Hizoka doit probablement perdre un temps dingue à faire un "du -s" à chaque itération. De son coté, kamui57 en perd probablement aussi un peu à afficher tout un tas de trucs dans la console, c'est gourmand en temps système ces trucs là. Pour conclure, l'idée de ǤƦƯƝƬ de vérifier l'espace disponible restant permettrait peut être d'éviter le plantage final que j'ai eu avec le script d'Hizoka, qui vient de la gamelle suivante : une clé usb de 4GB formatée fait moins de 4GB
J'ai eu deux scripts pour le prix d'un, mon problème est résolu, et j'ai appris tout un tas de choses, de très vifs remerciements à tous
edit: je n'avais pas vu le dernier post d'Hizoka, ma réponse n'en tiens donc pas compte pour l'heure
edit2: la deuxième proposition d'Hizoka marche sans problème. Encore merci
Dernière modification par Aldian (Le 20/07/2010, à 22:44)
Hors ligne
#22 Le 20/07/2010, à 23:07
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
en effet je suis plus long..
on gagnerait peut être du temps avec ça :
entree="dossier des mp3"
sortie="dossier du lecteur mp3"
# boucle lisant les mp3 1 par 1
while read mp3
do
# Taille du fichier de destination
taille=$(du -s "${mp3}")
taille=${taille%%??${mp3}}
# Comptabilise la taille totale des fichiers, évite de lister tout le dossier de sortie
taille_totale=$((${taille_totale:-0} + ${taille}))
# verifie que la taille du dossier est inferieur à 4go approximativement à adapter à la bonne taille
if [[ ${taille_totale} -lt 4000000 ]]
then
# si c'est vrai, on copie le fichier
cp "${mp3}" "${sortie}"
else
# on arrête la boucle, ou "exit" pour quitter le script....
break
fi
# envoie du retour de la recherche de mp3 suivit du mélange de ceux ci dans la boucle
done < <(find "${entree}" -type f -iname '*.mp3' | sort -R)
si tu veux le tester...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#23 Le 21/07/2010, à 00:43
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
En fait je ne peux pas le chronomètrer parce qu'il se gamelle quelque part: J'ai des erreurs dans le style
./Hizoka3.sh: line 12: 27351 + 7028 /chemin/vers/fichier/nom_fichier: division par 0 (error token is "/chemin/vers/fichier/nom_fichier")
Au début j'ai cru que la gamelle se situait au niveau du passage de 32768 (la gamelle habituelle du programmeur c), mais même pas, des fois c'est au dessus, des fois c'est en dessous, mais systématiquement le début se passe bien.
Je précise encore (mais je ne sais pas si ça a un rapport) qu'à chaque fois c'est des noms de fichiers qui comprennent des trucs entre parenthèses et des trucs entre crochets.
Hors ligne
#24 Le 21/07/2010, à 09:39
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Sinon tu peux passer par:
df | grep USB | awk '{print $4}'
Qui indique la taille disponible, en octets, sur ta clef USB (en supposant que son nom contient USB), sans s'embêter avec chaque fichier.
C'est lu au niveau du système de fichier donc c'est super rapide.
Red flashing lights. I bet they mean something.
Hors ligne
#25 Le 21/07/2010, à 09:43
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
le probleme, c'est le calcul, la taille ne fait pas 7028 mais 7028 /chemin/vers/fichier/nom_fichier.
donc en effet les [ posent probleme.
on modifie :
taille=$(du -s "${mp3}")
taille=${taille%%??${mp3}}
par
taille=$(du -s "${mp3}" | sed 's/\t.*//')
là ça passe chez moi (même avec des crochets, des parenthèses et des {})
PS : c'est vrai que df est rapide...
Dernière modification par Hizoka (Le 21/07/2010, à 09:45)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne