72 votes

Nom de fichier sans extension dans la boucle for de bash

Dans une boucle for comme celle-ci :

for f in `ls *.avi`; do echo $f; ffmpeg -i $f $f.mp3; done

$f sera le nom complet du fichier, y compris l'extension. Par exemple, pour song1.avi, la sortie de la commande sera song1.avi.mp3. Existe-t-il un moyen d'obtenir uniquement song1, sans le .avi, à partir de la boucle for ?

J'imagine qu'il existe des moyens de le faire en utilisant awk ou d'autres outils de ce type, mais j'espère qu'il y a quelque chose de plus direct.

Merci

107voto

Mu Qiao Points 3199

Utiliser l'expansion des paramètres de bash

${f%%.*}

Notez que vous avez besoin de la version gourmande car il y a plusieurs points dans le nom du fichier.

Du manuel de bash :

${paramètre%mot}

${paramètre%%mot}

Le mot est développé pour produire un motif, tout comme dans l'expansion de nom de fichier. Si le motif correspond à une partie arrière de la valeur développée du paramètre, le résultat de l'expansion est la valeur du paramètre avec le motif le plus court (cas '%') ou le motif le plus long (cas '%%') supprimé. Si le paramètre est '@' ou ' ', l'opération de suppression de motif est appliquée à chaque paramètre positionnel tour à tour, et l'expansion est la liste résultante. Si le paramètre est une variable de tableau dont l'indice est '@' ou ' ', l'opération de suppression de motif est appliquée à chaque membre du tableau tour à tour, et l'expansion est la liste résultante.

24voto

spsuaiken Points 61

Cela devrait le faire :

for i in *.m4a; do
  ffmpeg -i $i ${i%%.*}.mp3
done

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X