我有一个音乐文件夹,每个文件夹中都有选定的播放列表,标题为“playlist.m3u”(也应匹配 *.m3u8)。
我想做的是让 shell 脚本生成一个与所有这些选定曲目连接的播放列表。但为了使播放列表正常工作,必须在歌曲标题之前添加文件夹名称。
这是一个目录结构示例:
Main Folder
`-> Album 1/
*.flac
playlist.m3u
`-> Album 2/
*.flac
playlist.m3u
`-> Album 3/
*.mp3
playlist.m3u
生成的 main-playlist.m3u 文件应如下所示:
Album 1/01. Song1.flac
Album 1/02. Song2.flac
Album 1/03. Song3.flac
Album 1/04. Song4.flac
Album 2/1-01. Song1 (Disc 1).flac
Album 2/1-02. Song2 (Disc 1).flac
Album 2/2-01. Song1 (Disc 2).flac
Album 2/2-02. Song2 (Disc 2).flac
Album 3/001. Song 001.mp3
Album 3/002. Song 002.mp3
Album 3/003. Song 002.mp3
<...>
Album 3/100. Song 100.mp3
Album 3/101. Song 101.mp3
对于最终拥有数千首曲目的歌曲库来说,最好、最有效的方法是什么?
答案1
使用find
?例如:
find . -type f -name '*.flac' -or -name '*.mp3'
或者使用绝对路径:
find $PWD -type f -name '*.flac' -or -name '*.mp3'
不区分大小写:
find $PWD -type f -iname '*.flac' -or -iname '*.mp3'
如果您确实想从这些“m3u”文件中提取列表,则可以使用以下方法:
find . -name '*.m3u' -print0 |
while IFS= read -r -d '' plist; do
len=$(wc -l < "$plist")
dir=$(dirname "$plist")
paste -d/ <(yes "$dir" | head -n$len) "$plist"
done
答案2
好吧,我只是发布一个我能够解决这个问题的方法。
#!/bin/sh
for album in */; do
while read -r track; do
printf "%s%s\n" "$album" "$track"
done < "${album}/playlist.m3u"
done > "main-playlist.m3u"