关于shell:创建“最近添加的专辑”m3u播放列表

Create a “Recently Added Albums” m3u playlist

我正在尝试创建一个播放列表,这个播放列表与你在iTunes中经常看到的"最近添加的专辑"播放列表想法相同,但使用的是$num_days_before参数。

我使用了这篇文章中的大多数想法:如何递归地查找和列出一个目录中最新修改的文件,其中包含子目录和时间?

我创建了一个脚本,可以使用以下参数运行:

1
create_m3u /dir_root/with/mp3s 60

其中$1是mp3的根目录(其中包含文件夹,也包含mp3)其中$2是从今天开始向后创建M3U播放列表文件的天数。

脚本的主要部分是以下命令:

1
2
3
4
find $1 -type f -iregex '.*\.mp3' -mtime -$2 -exec stat --format '%Y %y %n' {} \; | \
sort -n | \
cut -d' ' -f5- | \
sed -e 's/^/\./'

现在我的问题是,上面的命令包括

1
cut d' ' -f5-

部分给出了这种类型的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
....
./RATKING - So It Goes - 2014 [V0]/09. Protein.mp3
./RATKING - So It Goes - 2014 [V0]/08. Puerto Rican Judo.mp3
./RATKING - So It Goes - 2014 [V0]/02. Canal.mp3
./RATKING - So It Goes - 2014 [V0]/05. Remove Ya.mp3
./RATKING - So It Goes - 2014 [V0]/04. So Sick Stories.mp3
./RATKING - So It Goes - 2014 [V0]/06. Eat.mp3
./RATKING - So It Goes - 2014 [V0]/03. Snow Beach.mp3
./RATKING - So It Goes - 2014 [V0]/07. So It Goes.mp3
./RATKING - So It Goes - 2014 [V0]/01. _.mp3
./RATKING - So It Goes - 2014 [V0]/10. Bug Fights.mp3
./RATKING - So It Goes - 2014 [V0]/11. Take.mp3
./Aesop Rock - The Blob (2014) [MP3 320]/01 The Blob.mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/06 - Requiem.mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/08 - Riot In My Brain!!.mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/10 - Can't Let It Go.mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/03 - Battling Voices From Beyond.mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/02 - Meepy Morp.mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/07 - Meepy Morp (Reprise).mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/09 - 7 SKIES H3 (Main Theme).mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/05 - Metamorphosis.mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/04 - In A Dream.mp3
./The Flaming Lips - 7 Skies H3 (2014) [V0]/01 - 7 SKIES H3 (Can't Shut Off My Head).mp3
./G. Love & Special Sauce - 2014 - Sugar/14 - Bad Girl Baby Blues.mp3
./G. Love & Special Sauce - 2014 - Sugar/06 - Sugar.mp3
./G. Love & Special Sauce - 2014 - Sugar/10 - Windshield Wipers.mp3
./G. Love & Special Sauce - 2014 - Sugar/02 - Nite Life.mp3
./G. Love & Special Sauce - 2014 - Sugar/09 - One Night Romance.mp3
./G. Love & Special Sauce - 2014 - Sugar/03 - Good Life.mp3
./G. Love & Special Sauce - 2014 - Sugar/04 - Nothing Else Quite Like Home.mp3
./G. Love & Special Sauce - 2014 - Sugar/05 - Smokin Blues.mp3
./G. Love & Special Sauce - 2014 - Sugar/08 - Saturday Night.mp3
./G. Love & Special Sauce - 2014 - Sugar/13 - Run For Me.mp3
./G. Love & Special Sauce - 2014 - Sugar/07 - Weekend Dance #2.mp3
./G. Love & Special Sauce - 2014 - Sugar/12 - Too Much Month.mp3
./G. Love & Special Sauce - 2014 - Sugar/01 - Come Up Man.mp3
./G. Love & Special Sauce - 2014 - Sugar/11 - Cheating Heart.mp3

这就是我想要它(部分)的方式,当专辑被添加到文件系统/pc时按日期排序。但是我另外想要的是让每个专辑按歌曲编号01、02、03、04排序…从每个文件夹/相册中,而不是上面看到的无序数字。

有没有人对我如何才能以不同的方式做到这一点有什么建议,这样我就能得到想要的结果?


您最初的命令有一些冗余——您链接的问题需要输出中的日期,而您没有,因此您可以跳过stat正在输出的某些字段。您也可以使用find -printf跳过stat。这应该有效(部分未经测试,抱歉):

1
2
3
4
5
find $1 -type f -iregex '.*\.mp3' -mtime -$2 --printf"%T@~.%h~%f
" |\
sort -t~ -nk1 -nk3 |\
cut -d~ -f2- |\
tr '~' '/'

find找到相同的文件,然后按以下格式打印:

1
2
3
[modified date in seconds since Unix epoch]~.[file directory]~[filename]
ex:
1234512345~./RATKING - So It Goes - 2014 [V0]~09. Protein.mp3

然后,我们首先按日期排序,然后按文件名排序(都是数字排序,并使用~作为字段分隔符)。最后,我们去掉日期字段,然后用正斜杠替换其余的~,给出完整的文件路径。

注意:只有您的文件在文件名的开头都有磁道号,并且对于文件路径(目录或文件名)中任何位置的~文件也不会给出正确的结果时,这才有效。它不是因为任何特殊原因而被选中的,如果需要,可以用更合适的字符替换它。字符替换(与使用正斜杠作为排序分隔符相反)是必需的(我假定!)每个文件所在的子目录的级别可能会有所不同。