音楽ライブラリをBPMで並べ替える

音楽ライブラリをBPMで並べ替える

私は bpm-tag というツールを使用しています。このツールは、mp3 ファイル ("myfile.mp3") を入力として受け取り、"myfile.mp3: XX.XXX BPM" を出力します。音楽ライブラリを調べて各曲の BPM を計算し、BPM に応じてディレクトリ (たとえば、<80 BPM の場合は "Slow" ディレクトリなど) に移動するスクリプトを実行したいと思います。その方法については漠然とした考えがありますが、bpm-tag の出力を解析して BPM の値を取得する方法がわかりません。

助言がありますか ?

答え1

これが私がやったことです。うまくいったようです (ただし、残念ながら bpm-tag は多くの曲に対して十分な精度がありませんでした...)。

#!/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)

ここでやっている

while IFS= read -r -d '' FILE; do
    echo "$FILE"
done < <(find . -type f -name '*.mp3' -print0)

フォルダーまたはそのサブフォルダー内にある、.mp3 (-name '*.mp3') で終わるすべてのファイル (-type f) を印刷します。-print0 および -r -d '' オプションはフォーマット目的であると理解していますが、どのように機能するのかよくわかりません。

関連情報