![使用 find、cat 等...从专辑播放列表生成 M3U 播放列表](https://linux22.com/image/224152/%E4%BD%BF%E7%94%A8%20find%E3%80%81cat%20%E7%AD%89...%E4%BB%8E%E4%B8%93%E8%BE%91%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8%E7%94%9F%E6%88%90%20M3U%20%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8.png)
我有一个音乐文件夹,每个文件夹中都有选定的播放列表,标题为“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"