#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
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.
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 !
ç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 !
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