Сортировать список файлов, как если бы они были смонтированы в формате union - mp3 m3u

Сортировать список файлов, как если бы они были смонтированы в формате union - mp3 m3u

Я собираю такую ​​коллекцию музыки:

Музыка/альбомы [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.

Связанный контент