Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/03/2007, 23h10   #1
Membre émérite
 
Inscription : juin 2006
Messages : 1 117
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : juin 2006
Messages : 1 117
Points : 989
Points : 989
Par défaut Mes MP3 et les IDV



Bonjour à vous !

J'ai un baladeur mp3 qui contient de la musique. Ces fichiers sont indexés dans la mémoire du baladeur (disque dur) par une procédure interne.
En fait, le baladeur fait son indexation personnelle des fichiers qui lui sont passés par le logiciel de transfert.

Ainsi, tous mes mp3 sont dans un répertoire présent sur le disque dur et on tous des noms de fichier barbares tel que "d1988e57.mp3".

Ce n'est pas du tout pratique pour gérer la musique sur mon ordinateur, alors je
voudrai faire un script qui renomme chacun de ces fichiers.
kromartien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2007, 00h11   #2
Rédacteur
 
Inscription : mars 2002
Messages : 557
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 557
Points : 673
Points : 673
Il y a un programme pour Gnome qui fait ça c'est easytag. Tu peux renommer les fichiers d'un répertoire dans le format que tu veux en utilisant les tags.
Nightfall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2007, 21h09   #3
Membre émérite
 
Inscription : juin 2006
Messages : 1 117
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : juin 2006
Messages : 1 117
Points : 989
Points : 989
Merci pour cette suggestion, mais je ne veux pas installer de programme avec GUI, surtout si c'est un logiciel Gnome

C'est surtout que je n'ai pas vocation à utiliser une application de ce genre couramment, donc je ne vois pas trop l'interêt d'installer un de ces logiciels.
Il me faut juste classer ces satanés fichiers, du plus petit au plus grand (par exemple Album < Artiste < Genre ) et 'en aurai fini avec ça.

De plus, c'est un exercice avec une certaine valeur ajoutée pour ce qui concerne l'acquisition de connaissances en script shell

J'ai écris un script shell finalement, mais je pense que (s'il marche ) il n'est pas du tout optimal.
Les difficultés que j'ai rencontré sont :
  • impossible d'employer la commande sed avec un pipe (?), donc je me suis servi de fichiers d'index.
  • La substitution avec sed ne fonctionne pas lorsqu'elle rencontre des noms de fichiers contenant des caractères pouvant être employés comme opérateurs dans des expression régulières : *,+,.
    Ainsi, certains espaces que je voulais faire disparaître ne partait pas, il fallait faire plusieurs passes.
  • Et la fin, je crois que c'est le pire. Je ne sais pas si une construction de ce genre existe (faire correspondre chaque ligne d'un fichier avec celle d'un autre fichier), mais vu comme j'ai commencé, je ne peux terminer que comme ça. J'ai juste le sentiment (sans test préalable) que ça ne va pas marcher.
Donc une solution (pas très élégante) serait de traiter chacun des fichiers ligne par ligne. Comme à chaque nom de fichier correspond un titre à la même ligne dans l'autre fichier et un répertoire de destination dans encore un autre fichier, il doit être possible de faire quelque chose, mais c'est vraiment pas propre.

(Dites moi si je me trompe, mais utiliser des fichiers intermédiaires est un hérésie du script shell. Il faut toujours se servir de stdin et stdout)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash

for i in $(ls -1 ./StockageBrut/*.mp3); do

        export AuteurName=$(mp3info -p "%a" $i) 
        export Title=$(mp3info -p "%t" $i)
#ici on extrait le nom de l'auteur et le titre contenus dans l'IDV du morceau

        if [ "$AuteurName" != "" ]; then
                
                echo -e "$AuteurName" >> ./RepClassement/ListeAuteurs.txt 
                echo "$Title" >> ./RepClassement/ListeFilename.txt 
                echo "$i" >> ./RepClassement/ListeNomCourant.txt fi;
#Ici on remplit les fichiers d'indexation
done;

#Conversion en UTF8
iconv -f ISO8859-1 -t UTF8 -o ./RepClassement/ListeAuteursUTF8.txt ./RepClassement/ListeAuteurs.txt
#Là c'est la conversion (jaime pas les <E09> à la place des é
iconv -f ISO8859-1 -t UTF8 -o ./RepClassement/ListeFilenameUTF8.txt ./RepClassement/ListeFilename.txt

sed "s/[/\ \\]/_/w ./RepClassement/ListeRepAuteurs1.txt" ./RepClassement/ListeAuteursUTF8.txt
sed "s/[/\ \\]/_/w ./RepClassement/ListeRepAuteurs2.txt" ./RepClassement/ListeRepAuteurs1.txt
sed "s/[/\ \\]/_/w ./RepClassement/ListeRepAuteurs3.txt" ./RepClassement/ListeRepAuteurs2.txt
sed "s/[/\ \\]/_/w ./RepClassement/ListeRepAuteurs4.txt" ./RepClassement/ListeRepAuteurs3.txt
sed "s/[/\ \\]/_/w ./RepClassement/ListeRepAuteurs5.txt" ./RepClassement/ListeRepAuteurs4.txt
#ici c'est pas beau c'est juste pour enlever les /, \ et les espaces des noms traités
#mais il faut plusieurs passes.
sed "s/[/\ \\]/_/w .RepClassement/ListeFilename1.txt" ./RepClassement/ListeFilenameUTF8.txt
sed "s/[/\ \\]/_/w .RepClassement/ListeFilename2.txt" ./RepClassement/ListeFilename1.txt
sed "s/[/\ \\]/_/w .RepClassement/ListeFilename3.txt" ./RepClassement/ListeFilename2.txt
sed "s/[/\ \\]/_/w .RepClassement/ListeFilename4.txt" ./RepClassement/ListeFilename3.txt
sed "s/[/\ \\]/_/w .RepClassement/ListeFilename5.txt" ./RepClassement/ListeFilename4.txt

#Là ça ne marche pas et ça ne marchera jamais. Il faut faire un test sur l'existence
#de chaque répertoire, et s'il n'existe pas le créer
Code :
1234567
for k in $(cat ./RepClassement/ListeRepAuteurs5.txt); do
if [ ! -d $k ]; then
mkdir $k
fi
#Et là je fais quoi pour parser les deux autres fichiers ?
mv "$LeNomCourantFichier" ./StockageClassed/"$LeTitreDeLaChanson".mp3
done
mkdir ./StockageClassed/$(less ./RepClassement/ListeRepAuteurs5.txt) mv -i $(less ./RepClassement/ListeNomCourant.txt) $(less ./RepClassement/ListeRepAuteur5.txt)$(ListeFilename5.txt)
Je préfère ne pas tester le script, vu tous les mv qu'il comporte, je préfère ne pas faire de bêtise.

Une construction "sensée" serait de traiter en même temps le nom de fichier, le titre, la création du répertoire de destination, le déplacement avec des tests sur l'existence où nom d'un répertoire le tout dans la même boucle for, mais je ne sais pas comment traiter les chaînes avec sed depuis l'entrée standard. Je sais que sed par défaut redirige tout vers la sortie standard, mais pour l'entrée il lui faut un fichier. Je pourrai à chaque fois créer un fichier, mais ce n'est pas très optimisé. De plus, sauriez vous comment éviter de faire le travail en plusieurs passes ?
kromartien est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h03.


 
 
 
 
Partenaires

Hébergement Web