Convertire OGG in MP3 usando Bash

A volte può capitare di dover convertire file audio in formato MP3. Esistono già dei programmi con interfaccia grafica in grado di svolgere questo compito, ma non sempre li abbiamo sotto mano. In un ambiente GNU/Linux è possibile però usare anche numerosi strumenti da riga di comando.

Per convertire un file OGG in MP3 si può usare, ad esempio, Sox e LAME. Chiaramente, dover convertire molti file, può risultare una operazione lunga e noiosa, ed è qui che uno script Bash può fare la differenza:

#!/bin/bash
for f in *.ogg; do
  sox $f tmp.wav
  lame -b 128 -q 2 tmp.wav ${f/.ogg/.mp3}
  rm -f tmp.wav
done

Come si può facilmente capire dal codice, si ciclano i file ogg contenuti nella directory in cui si esegue lo script, si convertono temporaneamente in formato WAV ed infine si crea l'MP3 per ogni file. In questo caso ho scelto di codificarlo a 128bit.

Questo script è ovviamente migliorabile. Ad esempio i file con uno o più spazi nel nome vengono saltati, per risolvere tale problema è necessario modificare leggermente lo script. Una soluzione può essere quella di sostituire agli spazi degli undescore.

#!/bin/bash
for f in *.ogg; do
  if echo "$f" | grep -q [[:space:]]; then
    newname=`echo $f | tr ' ' '_'`
    mv "$f" $newname
    f=$newname
  fi
  sox $f tmp.wav
  lame -b 128 -q 2 tmp.wav ${f/.ogg/.mp3}
  rm -f tmp.wav
done

Il codice ottenuto è ancora migliorabile, infatti se l'estensione dei file non è "ogg" in minuscolo, ma contiene delle lettere maiuscole (ad esempio "OGG" o "OgG"), lo script non funziona. Per gestire anche questo caso è sufficiente una piccola modifica. Oltre a questo semplifico anche il codice togliendo il blocco if:

#!/bin/bash
for f in *.[Oo][Gg][Gg]; do
  newname=`echo $f | tr ' ' '_' | sed -e s/[Oo][Gg][Gg]$/ogg/`
  mv "$f" $newname
  f=$newname
  sox $f tmp.wav
  lame -b 128 -q 2 tmp.wav ${f/.ogg/.mp3}
  rm -f tmp.wav
done

A questo punto lo script dovrebbe coprire un buon numero di casi d'uso.

Grazie mille. E' utilissimo questo script bash. Se avrò bisogno quando dovrò scrivere uno script bash verò da te!

Perfetto.
L'unica cosa è accertarsi di avere installato libsox-fmt-ogg

Veramente utile... fatto su misura per chi cerca una soluzione veloce senza leggersi troppa documentazione. Grazie!

Il problema degli spazi è ricorsivo negli script bash, proverò la tua soluzione... grazie