Ich verwende ein Tool namens bpm-tag, das eine MP3-Datei („myfile.mp3“) als Eingabe verwendet und „myfile.mp3: XX.XXX BPM“ ausgibt. Ich möchte ein Skript ausführen, das meine Musikbibliothek durchsucht, die BPM jedes Songs berechnet und ihn entsprechend seiner BPM in ein Verzeichnis verschiebt (z. B. Verzeichnis „Slow“ für <80 BPM usw.). Ich habe eine vage Idee, wie das geht, weiß aber nicht, wie ich die Ausgabe von bpm-tag analysieren soll, um den BPM-Wert zu erhalten.
Irgendwelche Vorschläge ?
Antwort1
Folgendes habe ich getan. Es schien zu funktionieren (aber leider war der BPM-Tag für viele Songs nicht genau genug ...).
#!/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)
Hier tun
while IFS= read -r -d '' FILE; do
echo "$FILE"
done < <(find . -type f -name '*.mp3' -print0)
druckt alle Dateien (-type f) mit der Endung .mp3 (-name '*.mp3'), die sich im Ordner oder einem seiner Unterordner befinden. So wie ich es verstehe, dienen die Optionen -print0 und -r -d '' der Formatierung, aber ich verstehe nicht wirklich, wie das funktioniert.