
各フォルダには、「playlist.m3u」(* .m3u8と一致する必要があります)というタイトルの選択されたプレイリストを含む音楽フォルダがあります。
私が望むのは、シェルスクリプトに選択したすべてのトラックに関連付けられたプレイリストを作成させることです。ただし、プレイリストが正しく機能するには、曲のタイトルの前にフォルダ名を追加する必要があります。
以下は、ディレクトリ構造の例です。
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"