通过BPM对音乐库进行排序


1

我正在使用一个名为bpm-tag的工具,它将一个mp3文件(“myfile.mp3”)作为输入并输出“myfile.mp3:XX.XXX BPM”。我想运行一个遍历我的音乐库的脚本,计算每首歌曲的BPM并根据其BPM将其移动到一个目录(例如目录“慢速”,用于< 80 BPM等)。我有一个模糊的想法如何做到但我不知道如何解析bpm-tag的输出以获得BPM的值。

有什么建议 ?


4
SU不是一个脚本编写服务 - 但是如果你遇到写自己的问题,我们中的许多人都愿意并且能够提供帮助。到目前为止你有什么?如果你想得到一个文件的“BPM”值,你似乎可以运行BPM = $(bpm-tag myfile.mp3 | cut -f2 -d“”),这会将BPM放入变量$ BPM
davidgo

2
直到你提到它们,我才知道sed和cut;谢谢。我已经想出如何编写我的脚本,我应该把它作为答案包括在内吗?
Adrien MORIN

如果你这样做肯定会有所帮助。 =)
Anaksunaman

Answers:


2

这就是我所做的。它似乎工作(但遗憾的是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''选项用于格式化目的,但我真的不知道它是如何工作的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.