Я собираю такую коллекцию музыки:
Музыка/альбомы [FLAC] Музыка/альбомы [MP3]
и создание плейлистов m3u, подобных этому (запускать в каталоге Music):
find "albums [FLAC]" "albums [MP3]" -type f \( -iname "*.mp3" -o -iname "*.flac" \) -print | sed 's/^\.\///g' | sort >> "$out_file"
но у меня было несколько подобных ситуаций:
Music/albums [MP3]/Artist A/album title/track.ext
Music/albums [MP3]/Artist B/album title/track.ext
Music/albums [FLAC]/Artist A/album title/track.ext
Music/albums [FLAC]/Artist B/album title/track.ext
Все альбомы определенного исполнителя не сгруппированы в плейлисте, а из-за сортировки находятся в верхней или нижней части списка.
Я экспериментировал с использованием overlayfs для их объединения, и это работает, но я ищу способ сортировки, чтобы m3u был больше похож на:
Music/albums [MP3]/Artist A/album title/track.ext
Music/albums [FLAC]/Artist A/album title/track.ext
Music/albums [MP3]/Artist B/album title/track.ext
Music/albums [FLAC]/Artist B/album title/track.ext
Мне кажется, что sort должен уметь это делать или это можно сделать на Python, но был бы признателен, если бы меня подтолкнули в правильном направлении!
решение1
В вашем конвейере есть sort
. Скажите ему, что вам нужно:
sort -t / -k 3,3 -k 2r,2 -k 4
где
-t /
указывает разделитель;-k 3,3
указывает на необходимость сортировки по третьему полю;- для записей с одинаковым третьим полем
-k 2r,2
указывает на обратную сортировку по второму полю - если этого недостаточно,
-k 4
говорит рассмотреть четвертое поле и все, что последует за ним.
Обратите внимание, что эта конкретная команда вообще не сортирует по первому полю. В вашем примере первое поле выглядит фиксированным: Music
.
Если вам все равно, MP3 это или FLAC, вы можете проигнорировать и второе поле. В таком случае сортировка должна быть выполнена по третьему полю и всему последующему. Команда для этого намного проще:
sort -t / -k 3
Чтобы узнать больше, см.этот вопроси man 1 sort
.