Bonjour,
Je me suis écrit un petit bout de bash pour lister le contenu de ma médiathèque :
for SongFile in /home/daniel/Musique/Jukebox/*/*/*/*.{mp3,ogg,flac} ; do echo $SongFile >> SongList done
et j'ai un résultat bizarre : ça ne me liste que les 27 281 premiers fichiers du répertoire, alors qu'il en reste encore pas mal...
Le fichier fait 2 401 990 octets.
Il y a une limite dans ce que peut écrire un script bash, ou une autre raison ?
C'est embêtant, car j'utilise ensuite cette liste trièe aléatoirement avec shuf pour recharger mon téléphone, et là il y a la moitié des artistes dont le nom commence par w et tous les suivants (dont ceux écrits en grec ou en cyrillique) que je n'écouterai jamais, c'est frustrant...
Merci d'avance pour vos lumières.
Le Monday 06 June 2016, 06:43:15 Daniel Cartron a écrit :
Bonjour,
Je me suis écrit un petit bout de bash pour lister le contenu de ma médiathèque :
for SongFile in /home/daniel/Musique/Jukebox/*/*/*/*.{mp3,ogg,flac} ; do echo $SongFile >> SongList done
Après quelques essais et surtout lecture attentive de la liste obtenue je réalise que l'ordre alphabétique est très bizarre : J'ai une partie de mon répertoire tirè de A à Щ, puis une autre triée de A à Z, puis encore une autre de A à W...
Au final il semble que j'aie la totalité du répertoire, mais je pige pas pourquoi c'est listé de cette façon. Mon script se base sur des numéros d'inode ou autre chose, mais pas sur l'ordre alphabétique du répertoire, ou un truc du genre ?
Du coup c'est pas grave, j'ai toute ma musique, mais j'aimerais comprendre pourquoi ça fait ça...
* Daniel Cartron [06/06/2016 07:01] :
for SongFile in /home/daniel/Musique/Jukebox/*/*/*/*.{mp3,ogg,flac} ; do echo $SongFile >> SongList done
[snip]
Au final il semble que j'aie la totalité du répertoire, mais je pige pas pourquoi c'est listé de cette façon. Mon script se base sur des numéros d'inode ou autre chose, mais pas sur l'ordre alphabétique du répertoire, ou un truc du genre ?
Ton script devrait te lister tous tes .mp3 puis tous tes .ogg puis tous les .flac de ton repertoire. Le contenu des varables d'environnement LC_* va aussi jouer sur l'ordre de ta liste.
Sinon, tu peux toujours faire :
find /home/daniel/Musique/Jukebox/ -name '*.mp3' -o -name '*.ogg' \ -o -name '*.flac' | sort > SongList
Emmanuel
Le Monday 06 June 2016, 07:58:00 Emmanuel Seyman a écrit :
Ton script devrait te lister tous tes .mp3 puis tous tes .ogg puis tous les .flac de ton repertoire. Le contenu des varables d'environnement LC_* va aussi jouer sur l'ordre de ta liste.
Bien sur, suis-je bête de ne pas avoir remarqué ça !
find /home/daniel/Musique/Jukebox/ -name '*.mp3' -o -name '*.ogg' \ -o -name '*.flac' | sort > SongList
Ha oui j'aime bien,, merci.
Bonjour Daniel,
Pour l'ordre c'est definit par les local defs,
LC_COLLATE=C ls
sinon utilise find
find /home/daniel/Musique/Jukebox/ -name *.{mp3,ogg,flac} | sort >> SongList
for i in */*/*.{ziv,tam} est expende par le shell, et va etre limite par le buffer du shell.
Le 06/06/2016 à 07:01, Daniel Cartron a écrit :
Le Monday 06 June 2016, 06:43:15 Daniel Cartron a écrit :
Bonjour,
Je me suis écrit un petit bout de bash pour lister le contenu de ma médiathèque :
for SongFile in /home/daniel/Musique/Jukebox/*/*/*/*.{mp3,ogg,flac} ; do echo $SongFile >> SongList done
Après quelques essais et surtout lecture attentive de la liste obtenue je réalise que l'ordre alphabétique est très bizarre : J'ai une partie de mon répertoire tirè de A à Щ, puis une autre triée de A à Z, puis encore une autre de A à W...
Au final il semble que j'aie la totalité du répertoire, mais je pige pas pourquoi c'est listé de cette façon. Mon script se base sur des numéros d'inode ou autre chose, mais pas sur l'ordre alphabétique du répertoire, ou un truc du genre ?
Du coup c'est pas grave, j'ai toute ma musique, mais j'aimerais comprendre pourquoi ça fait ça...
Le Monday 06 June 2016 08:43:13, vous avez écrit :
find /home/daniel/Musique/Jukebox/ -name *.{mp3,ogg,flac} | sort >> SongList
Ha ça ne marche pas...Mais c'est pas grave, le code d'émmanuel marche, ça me suffit.
for i in */*/*.{ziv,tam} est expende par le shell, et va etre limite par le buffer du shell.
Merci pour l'info. J'ai encore appris qq chose. Et du coup maintenant j'ai 27 336 au lieu de 27 281... Je ne vois pas d'où sortent les 50 fichiers en plus, faudra que je prenne le temps de faire un diff...
Le Monday 06 June 2016, 12:03:22 Daniel Cartron a écrit :
Je ne vois pas d'où sortent les 50 fichiers en plus, faudra que je prenne le temps de faire un diff...
Première surprise : quand j'ai écrit un nom de répertoire ou de fichier avec deux espaces consécutifs (erreurs de frappe) le for/done me supprime l'espace en trop, le find garde l'orthographe originale...
Ensuite pour les fichiers manquants, il y a au moins un groupe dont le nom de l'album commence par ... et donc il est considéré comme répertoire caché ce qui fait qu'il n'est pas listé par for mais il n'est par find..
Conclusion, find gagne haut la main. Me reste plus qu'à finir d'éplucher mon diff pour corriger les erreurs d'espaces.
* Daniel Cartron [06/06/2016 12:36] :
Première surprise : quand j'ai écrit un nom de répertoire ou de fichier avec deux espaces consécutifs (erreurs de frappe) le for/done me supprime l'espace en trop, le find garde l'orthographe originale...
La directive for travaille sur une liste d'élements séparés par des espaces. Du coup, il est tout à fait normal que ça arrive.
for i in a b; do echo $i; done et for i in a b; do echo $i; done
donnent le même résultat.
Ensuite pour les fichiers manquants, il y a au moins un groupe dont le nom de l'album commence par ... et donc il est considéré comme répertoire caché ce qui fait qu'il n'est pas listé par for mais il n'est par find..
Note qu'il y a un caractère unicode pour désigner les points de suspension : U+2026 (…)
Emmanuel