각 폴더에 "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"