Main menu:

Site search

Categories

septembre 2009
L M M J V S D
 123456
78910111213
14151617181920
21222324252627
282930  

Archive

Effectuer une même opération sur un ensemble de fichiers (version améliorée)

Dans un billet précédent, je montrais comment effectuer une opération sur un ensemble de fichiers en utilisant une simple ligne de commande. Je prenais comme exemple, pour illustrer le billet, la conversion d’un ensemble de fichiers audio .wav en mp3. Les commandes données fonctionnent très bien mais elles ont un inconvénient: lors de la conversion, l’extension .mp3 est ajoutée au fichier audio de sorte que le résultat est du genre mon_fichier.wav.mp3. Ce n’est pas vraiment gênant mais il est possible de faire en sorte que le fichier soit renommé de façon à ce que l’indication .wav soit enlevée et que cela devienne mon_fichier.mp3.

Pour arriver à ce résultat, on peut utiliser la commande basename qui permet de se débarrasser du path éventuel associé au fichier et de son extension.
On l’utilisera comme ceci:

$ find ~/music -name \*.wav | while read x; do lame -b 192 -h "$x" "`basename "$x" .wav`.mp3";done

Ou si vous préférez une boucle for:

$ for i in *.wav;do lame -b 192 -h "$i" "`basename "$i" .wav`.mp3";done

Attention de bien respecter le guillemets et apostrophes inversées ‘`’ autour de la commande basename et de ses arguments.

Comments

Comment from Yann
Time: 7 septembre 2009, 9 h 13 min

les backquote peuvent être aisément remplacer par $(commande) je trouve ça plus beau et sous un clavier azerty plus simple à taper 😉

echo `uptime` == echo $(uptime)

bon ok il faut un bash « récent » (fonctionne sous sarge) mais ça devrais le faire pour pas mal de monde.