Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 18/03/2008, à 00:03

PPN

[Script/bash] Remplir aléatoirement votre baladeur MP3

Bonsoir à tous,

j'ai développé ce script pour mon propre besoin, mais si celà peut interesser des gens c'est encore mieux smile

Mon besoin était le suivant :
Remplir mon lecteur MP3 à partir de fichiers *.mp3 aléatoirement choisis sur mon PC

Utilisation du script:
Il se décompose en 4 parties
* Selectionner le répertoire qui acceuillera les mp3 (donc votre lecteur mp3 ou mémoire SD)
* Selectionner le répertoire qui contient tous vos mp3 (typiquement /media/MP3 chez moi)
* Selectionner le nombre de MP3 que vous voulez ainsi copier
* Récapitulatif avec barre de progression et possibilité d'annuler

Le script :
Il a été réalisé en shell avec zenity, donc très facile à personnaliser si besoin, il effectue les actions suivantes
* Recherche à partir du répertoire source de tous les fichiers avec extension ".mp3"
* Constitution du fichier plat "listmp3" à partir des résultats de la recherche précédente
* Génération d'un nombre aléatoire entre 1 et le nombre de ligne dans "listmp3"
* Le fichier mp3 étant positionné à la ligne dont le numéro a été choisi au hasard est copié dans le lecteur mp3

Il est possible d'ajouter d'autres formats que le mp3 (que celui qui a dit wma se dénonce! lol), il faut ajouter la ligne find $rep_orig -name *.EXTENSION >> listmp3 en dessous de find $rep_orig -name *.mp3 > listmp3 et ceci pour autant d'extensions que voulus! (non testé de mon côté mais ya pas de raisons que ça marche pas)

Remarque :
* Le nombre aléatoire est généré avec perl, vérifier que la commande perl est accessible sur votre poste (il me semble que c'est en natif sur GG)
* Sur l'écran du récapitulatif je n'arrive pas à afficher le nom complet des lecteurs si ils ont des espaces (bug zenity?), mais pas de panique, ca copie bien là ou il faut smile
* Ne pas supprimer, renommer, ou modifier le fichier "listmp3" durant la copie. Ce fichier est supprimé en cas d'annulation ou fin de la copie.
* Pour les curieux qui se demandent, le cas ou je décrémente le nombre de fichiers copiés est pour le cas ou le fichier aléatoirement choisi pour être copié existe déjà sur le lecteur destination.

Source :

#!/bin/bash
rep_dest=$(zenity --title="Choisir le répertoire de destination des MP3" --file-selection --directory)
if [[ $rep_dest"x" = "x" ]]
then 
    exit 1
fi
rep_orig=$(zenity --title="Choisir le répertoire source des MP3" --file-selection --directory)
if [[ $rep_orig"x" = "x" ]]
then 
    exit 1
fi
nbre_fic=$(zenity --title "Nombre de MP3 à copier" --entry --text "Saisir le nombre de MP3 à copier.")
if [[ $nbre_fic"x" = "x" ]]
then 
    exit 1
fi

find $rep_orig -name *.mp3 > listmp3

nbre_total_mp3=`wc -l listmp3 | cut -d" " -f1`

fic_copies=0
(
while test $fic_copies -lt $nbre_fic
do
    rand=`perl -e '@c=(1..'$nbre_total_mp3');print join("",@c[map{rand @c}(1)]),'`
    fic_orig=`head -$rand listmp3 | tail -1`
    cp "$fic_orig" "$rep_dest"
    if test $? -eq 1
    then
        fic_copies=$(($fic_copies-1))
    fi
    fic_copies=$(($fic_copies+1))
    clear    
    expr `expr $fic_copies \* 100` / $nbre_fic
done
echo 100
) | 
zenity --progress --auto-kill \
--title="Copie des MP3" \
--text="Copie de "$nbre_fic" fichier(s)...
de "$rep_orig" 
vers "$rep_dest" " \
--percentage=0

rm listmp3

Dernière modification par PPN (Le 18/03/2008, à 00:34)

Hors ligne

#2 Le 18/03/2008, à 02:03

bakalegum_

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

beau gosse cool

Hors ligne

#3 Le 18/03/2008, à 12:54

GuISm0

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Ca marche aussi pour l'ipod ou l'iphone ?!

Hors ligne

#4 Le 18/03/2008, à 13:03

iuchiban

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

J'ai des fichiers ogg sur mon PC et oggplay sur mon Nokia 6110.
Faudrait rajouter ça wink


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#5 Le 18/03/2008, à 13:13

PPN

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

GuISm0 a écrit :

Ca marche aussi pour l'ipod ou l'iphone ?!

j'ai fait des recherches sur le net et ya pas moyen de trouver une ligne de commande gtkpod (ou un équivalent) pour copier un fichier musical vers l'ipod :'(
Si ca existe c'est facile d'adapter le code

Pour le fichier OGG il faut modifier le code:
ajouter la ligne find $rep_orig -name *.ogg >> listmp3
juste apres la ligne find $rep_orig -name *.mp3 > listmp3

Les fichier ogg seront cherchés sur le même répertoire source que les mp3


EDIT : je viens de trouver ca http://www.gnu.org/software/gnupod/gnupod.html#SEC11
qui permettrait de copier les fichiers en ligne de commande mais n'ayant pas de ipod pour tester... (ce problème sera réglé dans la semaine big_smile)

Dernière modification par PPN (Le 18/03/2008, à 14:07)

Hors ligne

#6 Le 21/03/2008, à 10:13

Pingu63

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

salut pour chercher plusieurs extension différente tu devrai faire comme sa :

find $rep_orig -name *.ogg *.mp3  >> listmp3

Comme sa il va les rechercher en une seul recherche donc sa prend moins de temps.

Voila c'était mon petit conseil.

Bon courage pour ton projet.

Pingu63

Hors ligne

#7 Le 18/04/2008, à 15:54

still

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Exactement (ou presque) ce que je cherchais.
Merci bcp.

Juste une remarque.
Une limite en poids serait plus judicieuse qu'un nombre de mp3

Je regarde ca ce soir.

#8 Le 18/04/2008, à 16:02

stefP

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

+1, j'ai fait une modif à l'arrache chez moi pour faire ça... mais je l'ai pas diffusé vu que c'est un peu artisanal.
Enfin, si quelqu'un veut améliorer ce que j'ai fait, je vous file le code :

#!/bin/bash
rep_dest=$(zenity --title="Choisir le répertoire de destination des MP3" --file-selection --directory)
if [[ $rep_dest"x" = "x" ]]
then 
    exit 1
fi
rep_orig=$(zenity --title="Choisir le répertoire source des MP3" --file-selection --directory)
if [[ $rep_orig"x" = "x" ]]
then 
    exit 1
fi

cd $rep_orig
find . -name *.mp3 > listmp3

nbre_total_mp3=`wc -l listmp3 | cut -d" " -f1`
taille_copie=`du -s $rep_dest| awk '{print $1}'`
(
while test $taille_copie -lt 477768
do
    rand=`perl -e '@c=(1..'$nbre_total_mp3');print join("",@c[map{rand @c}(1)]),'`
    fic_orig=`head -$rand listmp3 | tail -1`
    cp "$fic_orig" "$rep_dest"
    taille_copie=`du -s $rep_dest| awk '{print $1}'`
    clear    
done
echo 100
) | 
zenity --progress --auto-kill \
--title="Copie des MP3" \
--text="Copie de "$rep_orig" vers "$rep_dest" " \
--percentage=0

rm listmp3

Hors ligne

#9 Le 22/04/2008, à 00:54

PPN

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Effectivement c'est une bonne idée de permettre cette option.

Au lieu de comparer "en dur" avec 477768 la taille du support externe, tu peux récupérer cette taille en faisant "df <point_de_montage>"

Par exemple chez moi:

romain@romain-ubuntu:/media/MP3$ df /media/IPOD
Sys. de fich.           1K-blocs       Occupé Disponible Capacité Monté sur
/dev/sdg               1981424   1962848     18576 100% /media/IPOD

Hors ligne

#10 Le 22/04/2008, à 11:07

stefP

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Oui, ce serait parfait, ce serait abuser de te demander comment tu modifierais le script? big_smile

Hors ligne

#11 Le 22/04/2008, à 17:36

PPN

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Par exemple si ton point de montage est /media/IPOD , la commande suivante retourne l'espace libre en Ko

df | grep "/media/IPOD" | awk '{print $4}'

Hors ligne

#12 Le 26/09/2010, à 15:13

stefP

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Bonjour,

2 ans et demi après, j'ai remis le nez dans le script.

Je l'ai simplifié pour mon usage. Pas de dialogue, pas de choix, juste un remplissage aléatoire comme voulu.

Si ça intéresse quelq'un ou si vous avez des remarques :

#!/bin/bash
rep_dest=/media/disk
rep_orig=~/Musique

rm $rep_dest/*
taille_lecteur=`df | grep $rep_dest | awk '{print $4}'`
taille_pris=`df | grep $rep_dest | awk '{print $3}'`
find $rep_orig -name *.mp3 > listmp3
nbre_total_mp3=`wc -l listmp3 | cut -d" " -f1`

taille_fichier=`du -s $fic_orig| awk '{print $1}'`
taille_pris=`df | grep $rep_dest | awk '{print $3}'`
taille_total=$(($taille_fichier+$taille_pris))

while test $taille_lecteur -gt  $taille_total
do
    rand=`perl -e '@c=(1..'$nbre_total_mp3');print join("",@c[map{rand @c}(1)]),'`
    fic_orig=`head -$rand listmp3 | tail -1`
    echo "copie de "$fic_orig
    taille_fichier=`du -s "$fic_orig"| awk '{print $1}'`
    pris=`df | grep $rep_dest | awk '{print $3}'`
    taille_total=$(($taille_fichier+$pris))
    if test $taille_lecteur -lt  $taille_total
    then
	break
    fi
    cp "$fic_orig" "$rep_dest"
done
rm listmp3

Hors ligne

#13 Le 26/01/2011, à 02:57

lylambda

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Salut,
En premier lieu, merci pour ce sujet qui répond parfaitement à un de mes besoins, à savoir charger aléatoirement  mon baladeur le plus simplement possible (utilisant un protocole UMS).
J'ai tout d'abord essayé le dernier script de stefP, mais je n'ai bizarrement pas réussi à le faire fonctionner. Par contre, le précédent datant de 2008 remplis parfaitement son rôle.

J'ai cependant modifié quelques éléments :
- Pas de choix de répertoire. J'ai spécifié ceux que j'utilise (= gain de temps)
- Effacement automatique des anciennes musiques sur le baladeur avec rm $rep_dest/* (idée issu du script de 2010).
- Augmentation de $taille_copie avec ma propre sortie de df | grep "/media/MUSIC" | awk '{print $4}' (moins 2000 ko pour laisser une marge)
- Ajout des formats .ogg (puisque mon baladeur le lis ^^) et .wma (navré…). La commande de Pingu63 bloquant chez moi, j'ai lu le man de "find" pour finir par écrire la commande suivante :
find . \( -name '*.mp3' -o -name '*.ogg' -o -name '*.wma' \) > listmusic
Elle fonctionne parfaitement. On peut aussi passer par une commande utilisant grep pour repérer les mimetypes audio, mais la génération de la liste est beaucoup plus longue.

Ce qui donne au final :

#!/bin/bash
rep_dest=/media/MUSIC/MUSIC
rm $rep_dest/*
if [[ $rep_dest"x" = "x" ]]
then 
    exit 1
fi
rep_orig=~/Musique
if [[ $rep_orig"x" = "x" ]]
then 
    exit 1
fi

cd $rep_orig
find . \( -name '*.mp3' -o -name '*.ogg' -o -name '*.wma' \) > listmusic

nbre_total_mp3=`wc -l listmusic | cut -d" " -f1`
taille_copie=`du -s $rep_dest| awk '{print $1}'`
(
while test $taille_copie -lt 938480
do
    rand=`perl -e '@c=(1..'$nbre_total_mp3');print join("",@c[map{rand @c}(1)]),'`
    fic_orig=`head -$rand listmusic | tail -1`
    cp "$fic_orig" "$rep_dest"
    taille_copie=`du -s $rep_dest| awk '{print $1}'`
    clear    
done
echo 100
) | 
zenity --progress --auto-kill \
--title="Copie de la Musique" \
--text="Copie de "$rep_orig" vers "$rep_dest" " \
--percentage=0

rm listmusic

J'aimerais aussi apporter quelques améliorations, mais mes tâtonnements en bash ne me le permette pas encore :
- Mesurer la taille disponible sur le baladeur sans spécifier une taille fixe dans le script (pour l'adapter à tout appareil selon sa mémoire).
- Faire une barre d'avancement dans Zenity ... qui avance ! Actuellement, elle reste à zéro jusqu'à ce que la copie se termine. Ou alors faire apparaître (dans un terminal ou zenity) le temps et/ou la mémoire restante avant la fin de la copie.
- Copier les fichiers de musique dans une arborescence de type [Auteur]/[Album]/Morçeaux tel qu'ils sont ordonnés dans mon répertoires ~/Musique, au lieu de les déposer en vrac dans le répertoire cible du baladeur.

J'espère que les ajouts réalisés seront utiles à quelqu'un. Et si vous avez des idées pour mettre en place les améliorations ci-dessus, je suis aussi preneur !

Dernière modification par lylambda (Le 26/01/2011, à 02:58)

Hors ligne

#14 Le 26/01/2011, à 15:37

llwynrt

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

pour la barre de progression, tu peux faire

echo "$pourcent"

dans ta boucle while, avec

$pourcent = $taille_utilisé * 100 / $taille_totale

Les erreurs Windows, c'est un peu comme les rêves, il faut savoir les interpréter, parfois ça peut vouloir dire quelque chose !
Abonnez-vous à Nolife : http://www.nolife-tv.com/

Hors ligne

#15 Le 27/01/2011, à 18:13

lylambda

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Merci pour le code !

Si je comprend bien, il faut déterminer une variable $pourcent basé sur les variables $taille_totale (= $taille_copie dans le script ?) et $taille_utilisé . C'est cette dernière qui m'ennuie. Comment décrire cette variable selon la quantité de données recopiées ?
La question résolu, il suffit alors de remplacer echo 100 qui remplis la barre de progression lorsque tout les fichiers sont copiés par echo "$pourcent" pour avoir une barre qui avance naturellement ?

Pour aborder le point de la copie par arborescence, est-il possible de modifier

    fic_orig=`head -$rand listmusic | tail -1`
    cp "$fic_orig" "$rep_dest"

pour prendre en compte les dossiers parents dans lesquels sont contenus les fichiers musicaux ? Sachant que les dossiers parents sont bien indiqués dans le fichier listmusic généré par find.


J'espère que mes questions ne sont pas trop stupides, même  pour un simple débutant ^^.

Dernière modification par lylambda (Le 27/01/2011, à 18:17)

Hors ligne

#16 Le 27/01/2011, à 18:57

llwynrt

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

j'ai fait comme ça :

#place restante sur le media sélectionné
taille_r=$(df | grep /media/S2 | awk '{print $4}')

#place occupée sur le media sélectionné
taille_u=$(du -s /media/S2 | awk '{print $1}')

#taille totale du media sélectionné
let "taille_t= $taille_r + $taille_u"

je réévalue ensuite la taille utilisée dans la boucle


Les erreurs Windows, c'est un peu comme les rêves, il faut savoir les interpréter, parfois ça peut vouloir dire quelque chose !
Abonnez-vous à Nolife : http://www.nolife-tv.com/

Hors ligne

#17 Le 14/02/2011, à 01:48

lylambda

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Me revoilà avec un nouveau script qui réalise tout ce que je souhaites :
- Contrôle du montage du baladeur. Interruption du script en son absence [edit]
- Suppression des anciens morceaux
- Sélection de tout les ogg, mp3 et wav de la bibliothèque musicale
- Remplissage du baladeur avec une liste aléatoire de morceaux
- La copie s'ajuste à la taille disponible
- Les morceaux sont classés automatiquement en dossiers (ex : [Auteur]/[Album])
- Indication du bon déroulement du script via Notify-OSD [edit]

Par contre, j'ai laissé tomber l'interface zenity pour privilégier une sortie en terminal via le lanceur du script des notifications via notify-OSD (mais merci à toi llwynrt pour tes indications !).

Le script est basé sur le tout dernier de stefP, mais remanié pour qu'il fonctionne chez tout le monde. Il suffit de modifier le répertoire d'origine et de destination. Je l'ai commenté aux maximum pour faciliter la tâche à ceux qui souhaiterais l'adapter à leur besoin.

En tout cas, merci à ce sujet qui m'aura poussé à apprendre un peu le bash !

#!/bin/bash

#####################################################
# Script de copie aléatoire de musique sur baladeur #
# Inspiré par stefP, écrit par lylambda             #
#####################################################

rep_dest=/media/MUSIC/MUSIC
# Définir le répertoire de destination
## /!\ À modifier selon le baladeur
rep_orig=~/Musique
# Définir le répertoire d'origine
## /!\ À modifier selon l'emplacement de la bibliothèque musicale

if [ -d $rep_dest ]; then
# Si le répertoire de destination existe :

    notify-send -i music-player "Random Music Copy" "\nSuppression des anciens morceaux"
    # Afficher une bulle de notification
    rm -r $rep_dest/*
    # Vider le répertoire de destination
    find $rep_orig \( -name '*.mp3' -o -name '*.ogg' -o -name '*.wma' \) | cut -d"/" -f5- > $rep_orig/listmusic
    # Créer dans le répertoire d'origine un fichier texte "listmusic"
    # Il liste tout les morceaux mp3, ogg et wma avec leurs dossiers parents respectifs (ex: [Auteur]/[Album]/Morceau)
    nbr_music=`wc -l $rep_orig/listmusic | cut -d" " -f1`
    # Compter le nombre de morceaux disponibles

    nbr_copie=0
    # Initialise le compteur de copie
    rand=`perl -e '@c=(1..'$nbr_music');print join("",@c[map{rand @c}(1)]),' | awk '{print $1}'`
    # Définir un nombre aléatoire entre 1 et le nombre de morceaux
    fic_music=`head -$rand $rep_orig/listmusic | tail -1`
    # Choisir le morceau correspondant dans la liste
    taille_music=`du -s "$rep_orig/$fic_music"| awk '{print $1}'`
    # Définir la taille du morceau choisis
    taille_dispo=`df $rep_dest | grep /media | awk '{print $4}'`
    # Définir la taille disponible sur le répertoire de destination 
    notify-send -i music-player "Random Music Copy" "\nInitiation de la copie aléatoire"
    # Afficher une bulle de notification

        while test $taille_dispo -ge $taille_music
        # Tester si la taille disponible est supérieur ou égal à la taille du morceau
        do
        # Si oui :
        cd $rep_orig
        cp --parents "$fic_music" "$rep_dest"
        cd
        # Copier le morceau et ses dossiers parents sur le répertoire de destination
        nbr_copie=$(($nbr_copie+1))
        # Compte le nombre de morceaux copiés
        rand=`perl -e '@c=(1..'$nbr_music');print join("",@c[map{rand @c}(1)]),' | awk '{print $1}'`
        # Définir un nouveau nombre aléatoire
        fic_music=`head -$rand $rep_orig/listmusic | tail -1`
        # Choisir le morceau correspondant dans la liste
        taille_music=`du -s "$rep_orig/$fic_music"| awk '{print $1}'`
        # Définir la taille du nouveau morceau choisis
        taille_dispo=`df $rep_dest | grep /media | awk '{print $4}'`
        # Actualiser la taille disponible sur le répertoire de destination

        if test $taille_dispo -lt $taille_music
        # Tester si la taille disponible est strictement inférieur à la taille du morceau
        then
        break
        fi
        # Si oui, sortie de boucle

    done
    notify-send -i music-player "Random Music Copy" "\nOpération terminée :\nCopie de $nbr_copie morceaux"
    # Afficher une bulle de notification
    rm $rep_orig/listmusic
    # Supprimer le fichier texte "listmusic"

else
# Si le répertoire de destination n'existe pas
    notify-send -i music-player "Random Music Copy" "\nBaladeur non-monté :\n$rep_dest introuvable."
fi

Dernière modification par lylambda (Le 24/02/2011, à 15:41)

Hors ligne

#18 Le 24/02/2011, à 15:30

lylambda

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Petite mise à jour du script dans le message précedent, avec  :

- Le contrôle du montage du baladeur et, en son absence, l'annulation du script.

- L'ajout de notification grâce à à la commande notify-send (affichage Notify-OSD sur les distrib Ubuntu récentes).
   ⋅ Suppression des anciens morceaux
   ⋅ Initiation de la copie aléatoire
   ⋅ Fin de l'opération
   ⋅ Baladeur non-monté

notificatio-osd

Dernière modification par lylambda (Le 24/02/2011, à 15:31)

Hors ligne

#19 Le 05/10/2011, à 11:34

stefP

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

lylambda a écrit :

Petite mise à jour du script dans le message précedent, avec  :

- Le contrôle du montage du baladeur et, en son absence, l'annulation du script.

- L'ajout de notification grâce à à la commande notify-send (affichage Notify-OSD sur les distrib Ubuntu récentes).
   ⋅ Suppression des anciens morceaux
   ⋅ Initiation de la copie aléatoire
   ⋅ Fin de l'opération
   ⋅ Baladeur non-monté

http://uppix.net/f/9/d/9adcec610d7cb9c1 … 111d95.png

8 mois après, je débarque...

Merci et bravo Lylambda, tu as bien optimisé mon pauvre script.

C'est testé et approuvé smile

Hors ligne

#20 Le 05/10/2011, à 23:04

lylambda

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Ravis que les modifications te soit utiles smile
Sans ton script, je n'aurais pas su par quoi commencer !

Pour infos, as-tu eu des soucis avec la gestion de fichiers parents des morceaux ? C'est très dépendant de ma manière de trier la musique. Si tu utilise plus de 2 niveaux (comme [Auteur]/[Album]/Morceau dans mon cas), il faudrait sans doute adapter le script.

De plus en me replongeant dedans, je me suis demandé si

rand=`perl -e '@c=(1..'$nbr_music');print join("",@c[map{rand @c}(1)]),' | awk '{print $1}'`
    # Définir un nombre aléatoire entre 1 et le nombre de morceaux

était parfaitement adapté (j'ai réutilisé la commande bêtement).
Sort elle un nombre aléatoire avec remise en jeu, ou sans ? S' il y a remise en jeu, il y a le risque d'écraser plusieurs fois un même morceau. Cela ne rendrait pas le script inopérant, mais alourdirait la procédure.
Bref, une piste possible d'optimisation.

D'ailleurs si tu as des propositions d'améliorations, n'hésite pas wink

Hors ligne

#21 Le 06/10/2011, à 21:50

stefP

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

J'ai le même rangement que toi pour ma musique, donc je ne peux pas te dire si ça fonctionne autrement, mais je pense que oui.

Pour le calcul du rand, effectivement, ça n'exclut pas un écrasement. Mais ce n'est pas bien grave, la taille dispo ne bougera pas alors, et tu n'auras pas de doublon.

Comme optimisation, certaines lignes avant le while sont inutiles je pense :

    
    rand=`perl -e '@c=(1..'$nbr_music');print join("",@c[map{rand @c}(1)]),' | awk '{print $1}'`
    # Définir un nombre aléatoire entre 1 et le nombre de morceaux
    fic_music=`head -$rand $rep_orig/listmusic | tail -1`
    # Choisir le morceau correspondant dans la liste
    taille_music=`du -s "$rep_orig/$fic_music"| awk '{print $1}'`
    # Définir la taille du morceau choisis
    taille_dispo=`df $rep_dest | grep /media | awk '{print $4}'`
    # Définir la taille disponible sur le répertoire de destination

Dernière chose, généralement le commentaire d'une ligne est au dessus, pas en dessous.

A plus smile

Hors ligne

#22 Le 10/10/2011, à 22:06

lylambda

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

la taille dispo ne bougera pas alors, et tu n'auras pas de doublon.

C'est juste, mais cela utilise bêtement des ressources système. N'y a t'il pas de possibilité simple d'éviter la remise en jeu ? Une option de commande ou autre. Sinon je suppose que ce serait possible de le scripter, avec la création d'une liste de nombre à exclure du tirage au sort au fur et à mesure de la copie.

Comme optimisation, certaines lignes avant le while sont inutiles je pense

Tu veux dire que le script fonctionnerait sans les 8 lignes que tu désignes ? Si les variables sont inexistantes avant la boucle, cela ne va t'il pas poser problème ?

Dernière chose, généralement le commentaire d'une ligne est au dessus, pas en dessous.

Arf, bon à savoir ! Hum… vais-je avoir le courage de modifier tout mes scripts ? On vas dire que c'est ma signature ^_^

En tout cas, merci pour ton retour !

Dernière modification par lylambda (Le 10/10/2011, à 22:07)

Hors ligne

#23 Le 07/03/2012, à 19:45

lylambda

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Cela aura mis du temps, mais voici une mise à jour de mon script de remplissage aléatoire de baladeur :

- la boucle de copie a été simplifié (avec tout bêtement un "while true"), ce qui réduit notablement le code (plus de variables à "préparer" avant la boucle).
- l'écrasement de morceau n'est plus possible (ajout de code évitant la remise en jeu au cours du tirage aléatoire )
- prise en compte des répertoires derrière des liens symboliques (ajout de l'option -L à find)
- réécriture des commentaires
- ajout d'un mode debug dans le terminal

Je ne vois rien d'autre pour l'améliorer. Mais tout avis est le bienvenu !

#!/bin/bash

######################################################
# Script de copie aléatoire de musique sur baladeur  #
# Écrit par lylambda, inspiré par stefP             #
# Version 4                         #
# Shell : Supprimez #++# pour activer les sorties    #
# http://forum.ubuntu-fr.org/viewtopic.php?id=200739 #
######################################################

# Définir le répertoire de destination
# /!\ À modifier selon le baladeur
rep_dest="/media/MUSIC/MUSIC"
# Définir le répertoire d'origine
# /!\ À modifier selon l'emplacement de la bibliothèque musicale
rep_orig="${HOME}/Musique"

#++#echo "Transfert musicale aléatoire de ${rep_orig} vers ${rep_dest}"
# Si le répertoire de destination existe :
if [[ -d ${rep_dest} ]]; then
    # Afficher une bulle de notification
    notify-send -i music-player "Random Music Copy" "\nSuppression des anciens morceaux"
    #++#echo "Suppression des anciens morceaux"
    # Vider le répertoire de destination
    rm -r ${rep_dest}/*
    # Créer dans le répertoire d'origine un fichier texte "listmusic"
    # --> Il liste tout les morceaux mp3, ogg et wma avec leurs dossiers parents respectifs (ex: [Auteur]/[Album]/Morceau)
    find -L ${rep_orig} \( -name '*.mp3' -o -name '*.ogg' -o -name '*.wma' \) | cut -d"/" -f5- > ${rep_orig}/listmusic
    #++#echo "Création de la liste des morceaux présents"
    # Créer dans le répertoire d'origine un fichier texte listant les nombres déjà utilisés dans le tirage aléatoire
    echo "Liste des nombres déjà utilisés" > ${rep_orig}/rand_used
    #++#echo "Initialiser de la liste des nombres déjà utilisés"
    # Compter le nombre de morceaux disponibles
    nbr_music=`wc -l ${rep_orig}/listmusic | cut -d" " -f1`
    #++#echo "${nbr_music} morceaux dans la bibliothèque"
    # Initialise le compteur de copie
    nbr_copie=0
    # Afficher une bulle de notification
    notify-send -i music-player "Random Music Copy" "\nLancement de la copie aléatoire"
    #++#echo "Lancement de la copie aléatoire"

        # Boucle de copie
            while true        
        do
        # Définir un nombre aléatoire sans remise en jeu entre 1 et le nombre de morceaux
        rand=`perl -e '@c=(1..'${nbr_music}');print join("",@c[map{rand @c}(1)]),' | awk '{print $1}'`
        test_remise=$(grep -c "${rand}" ${rep_orig}/rand_used)
        if [[ "${test_remise}" != "0" ]]; then
            echo "/!\ Morceau ${rand} déjà copié"
        else
            echo ${rand} >> ${rep_orig}/rand_used
            # Choisir le morceau correspondant dans la liste
            fic_music=`head -${rand} ${rep_orig}/listmusic | tail -1`
            # Définir la taille du morceau choisis
            taille_music=`du -s "${rep_orig}/${fic_music}"| awk '{print $1}'`
            # Définir la taille disponible sur le répertoire de destination 
            taille_dispo=`df ${rep_dest} | grep /media | awk '{print $4}'`
            # Copier le morceau et ses dossiers parents du répertoire d'origine vers le répertoire de destination
            cd $rep_orig &&    cp --parents "$fic_music" "$rep_dest" && cd
            # Compte le nombre de morceaux copiés
            nbr_copie=$((${nbr_copie}+1))
            #++#echo "Copie N°${nbr_copie} : Morceau ${rand} ${fic_music}"
            # Tester si la taille disponible est strictement inférieur à la taille du morceau
                if test ${taille_dispo} -lt ${taille_music}; then
                ##echo "Répertoire de destination plein"
                break
                fi
            fi
        done

    # Afficher une bulle de notification
    notify-send -i music-player "Random Music Copy" "\nOpération terminée :\nCopie de ${nbr_copie} morceaux"
    #++#echo "Copie de ${nbr_copie} morceaux"
    # Supprimer le fichier texte "listmusic"
    rm ${rep_orig}/listmusic
    rm ${rep_orig}/rand_used
    #++#echo "Suppression des fichiers temporaires"

# Si le répertoire de destination n'existe pas
else
    notify-send -i music-player "Random Music Copy" "\nBaladeur non-monté :\n${rep_dest} introuvable."
    #++#echo "${rep_dest} introuvable"
fi
#++#echo "Script terminé correctement"
#++#sleep 300
exit 0

Hors ligne

#24 Le 07/03/2012, à 20:28

cracolinux

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Salut!

Peut-être que sort -R pourrait réduire considérablement la taille du script.
Style :

find ${rep_orig} -type f -iname "*.mp3" | sort -R > listing_mp3_aléatoire

Ensuite, tu prends le nombre de lignes dont tu as besoin à partir du début.

smile


Pixup : postez vos images vite et bien
« Ne devenez jamais pessimiste. Un pessimiste a plus souvent raison qu'un optimiste, mais l'optimiste s'amuse plus — et aucun des deux ne peut arrêter la marche du monde. » R.Heinlein

Hors ligne

#25 Le 07/03/2012, à 21:23

lylambda

Re : [Script/bash] Remplir aléatoirement votre baladeur MP3

Rhoo merci, de l'aléatoire tout simple !
Je ne connaissais pas cette fonction :-) . À vais voir ce que cela peut donner

Hors ligne

Haut de page ↑