Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/01/2014, à 11:16

joko

lister n derniers fichiers de CHAQUE sous répertoire

bonjour,
voilà, j'ai un grand répertoire de musique composé de sous-répertoires que j'alimente régulièrement. Je me suis fait un petit script qui me permet de récupérer les "mp3" de tous les sous-répertoires depuis n derniers jours (variable jours dans le script)

jours=$(zenity --scale --text "pick a number" --min-value=1 --max-value=100 --value=1 --step 2)

cd "/media/FreeAgent Drive/musique"
find -mtime -$jours | grep mp3 > play_list.m3u 
audacious play_list.m3u 

ça sort une liste m3u directement lisible dans audacious
je voudrais avoir le même type de résultat MAIS sur les n derniers fichiers de chaque sous-répertoire
ainsi dans le script zenity je pourrais ajouter l'option avec des boutons radios choix entre n derniers jours ou n derniers fichiers

merci de votre attention
p.s le code n'est pas des plus parfaits, notamment sur le côté "mp3", si je pouvais lister par rapport au type mime... mais là ça me dépasse un peu


Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks

Hors ligne

#2 Le 07/01/2014, à 11:52

Postmortem

Re : lister n derniers fichiers de CHAQUE sous répertoire

Salut,

#!/bin/bash
cd "/media/FreeAgent Drive/musique"
rm -f play_list.m3u
shopt -s globstar
for rep in **/
do
   rep=${rep%/}
   list=( "$rep"/*.mp3 )
   echo "${list[@]: -3}" >> play_list.m3u
done
audacious play_list.m3u

Pour le find, je ferais plutôt ainsi :

find -name '*.mp3' -type f -mtime -$jours > play_list.m3u

Edit : rajout de l'option -f au rm afin d'éviter les erreurs s'il n'y a pas déjà un fichier play_list.m3u

Re-edit :
Pour le find, tu peux chercher plusieurs extension ainsi :

find -regex '.+\.\(mp3\|ogg\)' -type f -mtime -$jours > play_list.m3u

Dernière modification par Postmortem (Le 07/01/2014, à 12:01)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 07/01/2014, à 18:43

joko

Re : lister n derniers fichiers de CHAQUE sous répertoire

merci beaucoup de tes conseils notamment pour :

find -regex '.+\.\(mp3\|ogg\)' -type f -mtime -$jours > play_list.m3u

j"avoue ne pas tout comprendre à ton script par exemple :

shopt -s globstar

pourrais-tu expliquer que cela fait/signifie ?
enfin et surtout je ne vois pas la notion des n derniers fichiers les plus récents.
par exemple si je veux les 4 fichiers les plus récents de chaque sous-répertoire, où renseigner cette valeur 4 ?

merci encore de ton aide...


Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks

Hors ligne

#4 Le 07/01/2014, à 19:01

Postmortem

Re : lister n derniers fichiers de CHAQUE sous répertoire

joko a écrit :

j"avoue ne pas tout comprendre à ton script par exemple :

shopt -s globstar

pourrais-tu expliquer que cela fait/signifie ?

Cela permet l'utilisation du pattern **.
Par exemple, si tu ne mets pas shopt -s globstar, * et ** sont équivalents :

# echo *
test
# echo **
test

Alors qu'avec shopt -s globstar :

# shopt -s globstar
# echo *
test
# echo **
test test/rep1 test/rep2

shopt -s globstar permet d'activer le fait que ** soit récursif.

joko a écrit :

enfin et surtout je ne vois pas la notion des n derniers fichiers les plus récents.
par exemple si je veux les 4 fichiers les plus récents de chaque sous-répertoire, où renseigner cette valeur 4 ?

merci encore de ton aide...

Le nombre est à renseigner là :

echo "${list[@]: -3}" >> play_list.m3u

On créé un tableau nommé list contenant tous les mp3 d'un répertoire :

list=( "$rep"/*.mp3 )

Puis on prend les 3 derniers éléments du tableau grâce à :

"${list[@]: -3}"

Par contre, je viens de me rendre compte que ça met les 3 éléments d'un dossier sur une même ligne, il faut remplacer :

echo "${list[@]: -3}" >> play_list.m3u

Par :

printf "%s\n" "${list[@]: -3}" >> play_list.m3u

Mais du coup, en fait c'est pas les x éléments les plus récents, j'avais mal lu ta demande, ce sont les x derniers éléments dans l'ordre alphabétique !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 07/01/2014, à 20:17

joko

Re : lister n derniers fichiers de CHAQUE sous répertoire

ok, super, je comprends un peu mieux, sinon comment avoir les x éléments les plus récents dans chaque (sous) répertoires ? (en fonction des dates et non des noms)

en tout cas merci...


Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks

Hors ligne

#6 Le 08/01/2014, à 14:04

Postmortem

Re : lister n derniers fichiers de CHAQUE sous répertoire

Salut,
Après quelques tests et tâtonnements :

shopt -s globstar extglob nullglob
nb_fics=3
extensions='mp3|ogg'
cd "/media/FreeAgent Drive/musique"
rm -f play_list.m3u
for rep in **/
do
   rep=${rep%/}
   list=("$rep"/*.@($extensions))
   index_recents=$(for i in "${!list[@]}"
      do
         stat -c "%Y;$i" "${list[i]}"
      done | sort -n | tail -$nb_fics | cut -d ';' -f 2)
   for j in $index_recents
   do
      echo "${list[j]}" >> play_list.m3u
   done
done
audacious play_list.m3u

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#7 Le 08/01/2014, à 17:53

joko

Re : lister n derniers fichiers de CHAQUE sous répertoire

hello ! smile
ça semble marcher très mais alors très très bien.
juste un petit commentaire :
a- j'ai testé ton script tel que et ça ne semblait pas marcher, avec mon script avec derniers jours comme paramètre j'avais en sortie : ./disco/Boney M - Belfast.mp3, alors que dans ton play_list.m3u, il n'y avait pas le ./, j'ai donc rajouté le ./ dans la ligne :

echo "./${list[j]}" >> play_list.m3u

et là tout roule, je ne sais pas si c'est vraiment dû à ça.

b- le traitement est assez long
apparemment j'ai énormément de sous-dossiers, peux-tu éventuellement confirmer la commande qui compte les sous-dossiers :

 find ./ -type d | wc -l

la commande me retourne 252 !!! je ne peux vraiment pas compter à la main :-)

en tout cas mille fois merci, il me reste plus qu'à intégrer ce script au mien
j'attends ta réponse pour le comptage de dossiers, si ça ne te dérange pas.


Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks

Hors ligne

#8 Le 08/01/2014, à 18:20

Postmortem

Re : lister n derniers fichiers de CHAQUE sous répertoire

Si tes sous-dossiers n'ont pas de nom contenant de retour à la ligne, c'est bon. Enfin, c'est 251 sous dossiers parce que find sort le dossier courant (.) aussi ! tongue

Pour le manque du ./, ça doit être le format des playlists .m3u qui l'impose mais j'avoue que j'avais pas essayé de lancer la playlist. Puis tu l'as bien corrigé !

Pour la durée du traitement, il doit y avoir moyen de faire plus court en faisant autrement (je pense à une solution à base de "ls" notamment)... Mais ma façon de faire marche peu importe le nom des fichiers/dossiers, chose qui ne serait pas le cas avec "ls". Après, y'a certainement d'autre moyen de faire (j'ai tendance à me compliquer la vie des fois ! )


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 08/01/2014, à 19:32

joko

Re : lister n derniers fichiers de CHAQUE sous répertoire

voici les deux scripts fusionnés mais dans le bloc if .. else .. fi, j'ai un pb, ça ne marche pas MAIS si je retire TOUT le bloc do..done alors je peux lancer la partie "derniers jours" et si je remets le bloc do...done, je ne peux même pas lancer sur derniers jours...
je pense pourtant avoir bien réalisé le bloc if then else fi...
peux-tu y jeter un oeil, d'autre part j'ai mis des petits commentaires...
mais merci quand même de me consacrer du temps, je réalise que ce n'est pas simple, mais ça fait travailler grave la cabessa :-)

#!/bin/bash
param=$(zenity  --list  --text "derniers" --radiolist  --column "Pick" --column "Opinion" TRUE jours FALSE fichiers)
#-------------------j'ai renommé ma variable jours en n_derniers de même pour nb_fics
n_derniers=$(zenity --scale --text "nombre de jours ou fichiers" --min-value=1 --max-value=50 --value=1 --step 1)
cd "/media/FreeAgent Drive/musique"
rm -f play_list.m3u
if  [[ "$param" == "jours" ]]
#---------------------------------------traitement sur les n derniers jours
then 
find -mtime -$n_derniers | grep -r "mp3" > play_list.m3u # si on pouvait remplacer mp3 par le type mime audio.... :-(
else
#---------------------------------------traitement sur les n derniers fichiers les plus recents
zenity --info --title "*** info radio meuh ***" --text="choix : derniers = fichiers" #le zenity est là juste pour tracer les variables...
shopt -s globstar extglob nullglob
n_derniers=1 # pour l'essai j'ai fixé à 1
extensions='mp3|ogg'
#-------jusqu'à extensions=... ça marche.....
#ce bloc for... done semble poser problème dans le bloc else...
for rep in **/
do
   rep=${rep%/}
   list=("$rep"/*.@($extensions))
   index_recents=$(for i in "${!list[@]}"
      do
         stat -c "%Y;$i" "${list[i]}"
      done | sort -n | tail -$n_derniers | cut -d ';' -f 2)
   for j in $index_recents
   do
      echo "./${list[j]}" >> play_list.m3u
   done
done
# fin du bloc semlbant poser pb
fi
audacious play_list.m3u

pris séparément les deux scripts fonctionnent nikel

Dernière modification par joko (Le 08/01/2014, à 19:36)


Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks

Hors ligne