En fait j'ai trouvé :
Il cherchait à supprimer un fichier dont le nom finit par .mp3.flac. Donc en remplaçant
rm "$i.flac";
par
rm "${i%.mp3}.flac";
Tout rentre dans l'ordre...
patou355 wrote:En fait j'ai trouvé :
Il cherchait à supprimer un fichier dont le nom finit par .mp3.flac. Donc en remplaçant
rm "$i.flac";
par
rm "${i%.mp3}.flac";
Tout rentre dans l'ordre...
Les comamndes que tu as postées indiquaient pourtant bien « rm "${i%.mp3}.flac" ». Pas bien ça, tu veux faire peur ? ^^
Et on peut même supprimer les points :
rm "${i%mp3}flac";
ce qui est assez logique finalement...
Effectivement, je l'ai peut-être changé par erreur entre temps, puis je suis revenu aux bases... enfin tj est-il que ça marche pour les mp3.

Je vais maintenant l'adapter pour wma (si si), flv (et oui encore plus dingue), flac et mp4.

Ensuite, j'aurais un scrpt de la mort qui convertit tout en .ogg
Voilà, on s'approche d'un résultat final qui fonctionne bien, en tout cas dans le cadre du test que je viens d'effectuer.
#!/bin/bash

#Conversion depuis mp3
find . -name "*.mp3" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%mp3}flac":"$i" "${i%mp3}flac" </dev/null;
        oggenc -b 128 "${i%mp3}flac";
        rm "${i%.mp3}.flac";
        rm "$i";
done

#Conversion depuis mp4
find . -name "*.mp4" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%mp4}flac":"$i" "${i%mp4}flac" </dev/null;
        oggenc -b 128 "${i%mp4}flac";
        rm "${i%.mp4}.flac";
        rm "$i";
done

#Conversion depuis m4b
find . -name "*.m4b" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%m4b}flac":"$i" "${i%m4b}flac" </dev/null;
        oggenc -b 128 "${i%m4b}flac";
        rm "${i%.m4b}.flac";
        rm "$i";
done

#Conversion depuis flv (fucking l*** video)
find . -name "*.flv" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%flv}flac":"$i" "${i%flv}flac" </dev/null;
        oggenc -b 128 "${i%flv}flac";
        rm "${i%.flv}.flac";
        rm "$i";
done


#Conversion depuis wma
find . -name "*.wma" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%wma}flac":"$i" "${i%wma}flac" </dev/null;
        oggenc -b 128 "${i%wma}flac";
        rm "${i%.wma}.flac";
        rm "$i";
done


#Conversion depuis flac
find . -name "*.flac" | while read i; 
do      oggenc -b 128 "$i";
        rm "$i";
done
Avec tous mes remerciements à Pikachu 🙂
Ce n'est pas fini 🙂. C'est dommage qu'il y ait ici duplication de code, on peut largement condenser :
# Une liste des types de fichiers à convertir, par extension
TYPES_SUPPORTES="mp3 mp4 m4a flac flv wma"

# On va parcourir tous les fichiers de l'arborescence, quels qu'ils soient
find . -type f | while read i; do
   # on récupère l'extension du fichier traité
   ext=${i##*.}

   # Si l'extension n'est pas dans la liste TYPES_SUPPORTES, le fichier est ignoré et on passe au suivant
   grep -q "$ext" <<<"$TYPES_SUPPORTES" || continue

   # On ne convertit évidemment pas les fichiers FLAC avec ffmpeg, c'est déjà fait...
   [ $ext != flac ] && ffmpeg -i "$i" -map_meta_data "${i%$ext}flac":"$i" "${i%$ext}flac" </dev/null

   oggenc -b 128 "${i%$ext}flac"

   rm "${i%$ext}flac"
done
Ainsi, pour convertir d'autres types de fichiers supportés par ffmpeg avec la même commande, tu n'aurais qu'à rajouter l'extension associé à la variable TYPES_SUPPORTES.

Es-tu cependant sûr de vouloir supprimer les fichiers FLAC originaux dans ton bloc « #Conversion depuis flac » ?
Bon, là je peux pas lutter 🙂

Par contre j'ai pas compris pk tu dis que la conversion en .flac est déjà faite...

et je vois pas non plus le lien entre TYPES_SUPPORTES et le 'find -type -f'
patou355 wrote:Bon, là je peux pas lutter 🙂

Par contre j'ai pas compris pk tu dis que la conversion en .flac est déjà faite...

et je vois pas non plus le lien entre TYPES_SUPPORTES et le 'find -type -f'
Je vais détailler le fonctionnement du script. Celui-ci va parcourir tous les fichiers, y compris ceux non multimédia. Mais seuls ceux dont l'extension est dans la variable TYPES_SUPPORTES seront effectivement convertis. Un fichier non multimédia sera ignoré (la commande « continue », si elle est exécutée, fait en sorte que les instructions situées après soient ignorée et fait passer la boucle au fichier suivant).
Par ailleurs, la commande ffmpeg dans le script va convertir ici n'importe quel fichier dont l'extension est déclarée dans TYPES_SUPPORTES en FLAC. Or les fichiers FLAC sont aussi dans TYPES_SUPPORTES. Dès lors pourquoi convertir du FLAC en FLAC ? Aussi pour ces fichiers la commande n'est pas exécutée, on passe directement à l'encodage en OGG.
Le but de ma réécriture était d'une part d'éviter la duplication de code (si tu devais modifier par exemple la commande ffmpeg, tu devrais sans ça la modifier autant de fois qu'elle apparaît), d'autre part de permettre la prise en compte de nouveaux fichiers multimédia sans peine ni copie de code (grâce à la variable TYPE_SUPPORTES).
C'est vrai que c'est beaucoup mieux pour celui qui écrit le code, et je vais sûrement adapter mon script à ta sauce 🙂
Par contre, cela veut dire que tous les fichiers sont stockés dans la variable, même si on en fait rien. Est-ce qu'on ne risque pas de faire exploser la taille de cette dernière ? Imaginons qu'il existe moult petits fichiers texte à côté par exemple. Ne risque-je pas d'alourdir mon programme ? Où sont stockées les variables (RAM, DD...) ?

Je reconnais que c'est tiré par les cheveux, parce que pour saturer 1 Gio de RAM avec une liste de fichier faut se lever tôt. Mais question de principe...
patou355 wrote: Par contre, cela veut dire que tous les fichiers sont stockés dans la variable, même si on en fait rien.
Quelle variable ? TYPES_SUPPORTES ? Son contenu n'est jamais modifié dans la boucle ; la commande suivante :
grep -q "$ext" <<<"$TYPES_SUPPORTES"
vérifie simplement si l'extension du fichier courant fait partie de celles définies dans la variable TYPES_SUPPORTES. Si tu préfères, une notation "développée" strictement équivalente serait :
echo "$TYPE_SUPPORTES" | grep -q "$ext"
L'opérateur "<<<" (avec 3 chevrons) permet d'envoyer le contenu d'une chaîne sur sur l'entrée standard de la commande qui le précède.
Ha oui non oublie ce que j'ai dit, erreur d'interprétation.

C'est vraiment différent d'un langage comme le C. Là j'aurais pas vu comment élaborer ce type de boucle sans test (if)...

En tout cas merci beaucoup 🙂