Estoy usando una herramienta llamada bpm-tag que toma un archivo mp3 ("myfile.mp3") como entrada y genera "myfile.mp3: XX.XXX BPM". Me gustaría ejecutar un script que recorra mi biblioteca de música, calcule los BPM de cada canción y la mueva a un directorio de acuerdo con sus BPM (por ejemplo, directorio "Lento" para <80 BPM, etc.). Tengo una vaga idea de cómo hacerlo, pero no sé cómo analizar la salida de bpm-tag para obtener el valor de BPM.
Alguna sugerencia ?
Respuesta1
Esto es lo que he hecho. Parecía funcionar (pero lamentablemente bpm-tag no era lo suficientemente preciso para muchas canciones...).
#!/bin/bash
cd /path/to/my/library
while IFS= read -r -d '' FILE; do
BPM=$(bpm-tag -f -n "$FILE" 2>&1 | sed "s/.mp3:/%/" | cut -d'%' -f2 | sed "s/ BPM//" | sed "s/^ //" | cut -d'.' -f1)
#bpm-tag has its output in stderr, so I use 2>&1 to redirect it to stdout, then format it with sed and cut
if [ "$BPM" -le 130 ]
then cp "$FILE" /path/to/my/library/Slow/
elif [ "$BPM" -le 180 ]
then cp "$FILE" /path/to/my/library/Medium/
else cp "$FILE" /path/to/my/library/Fast/
fi
done < <(find . -type f -name '*.mp3' -print0)
aquí haciendo
while IFS= read -r -d '' FILE; do
echo "$FILE"
done < <(find . -type f -name '*.mp3' -print0)
imprime todos los archivos (-tipo f) que terminan en .mp3 (-nombre '*.mp3') que están en la carpeta o una de sus subcarpetas. Según tengo entendido, las opciones -print0 y -r -d '' son para fines de formato, pero realmente no entiendo cómo funciona.