BPM을 기준으로 음악 라이브러리 정렬

BPM을 기준으로 음악 라이브러리 정렬

저는 mp3 파일("myfile.mp3")을 입력으로 사용하고 "myfile.mp3: XX.XXX BPM"을 출력하는 bpm-tag라는 도구를 사용하고 있습니다. 내 음악 라이브러리를 통해 각 노래의 BPM을 계산하고 해당 BPM에 따라 디렉터리로 이동하는 스크립트를 실행하고 싶습니다(예: <80 BPM의 경우 "Slow" 디렉터리 등). 어떻게 해야 할지 막연하게 알고 있지만 BPM 값을 얻기 위해 bpm-tag의 출력을 구문 분석하는 방법을 모르겠습니다.

어떤 제안?

답변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 '' 옵션은 서식 지정을 위한 것이지만 실제로 어떻게 작동하는지 이해하지 못합니다.

관련 정보