Как найти заголовок серии с помощью команды grep из списка путей?

У меня есть следующая команда:

find /home/cas/plex-media/series/ -type f -name '*.srt' | grep -v .en.srt

, которая найдет все файлы .srt , которые не находятся в .en.srt в каталог и подкаталоги серии .

Это даст мне список, который может выглядеть следующим образом:

/home/cas/plex-media/series/Scorpion/Season 4/Scorpion - S04E06 - Queen Scary.srt
/home/cas/plex-media/series/Scorpion/Season 4/Scorpion - S04E03 - Grow a Deer, A Female Deer.srt
/home/cas/plex-media/series/Devs/Season 1/Devs - S01E03 - Episode 3.srt
/home/cas/plex-media/series/Modern Family/Season 8/Modern Family - S08E21 - Alone Time.srt

Это упрощенная версия. Может быть 5 или 300 выходов, где, например, может быть 8 или 50 раз Скорпион. Вывод очень сильно различается.

Я пытаюсь найти команду (которую я мог бы передать за исходной командой), которая даст мне результат:

Scorpion, Devs, Modern Family

А не:

Scorpion, Scorpion, Scorpion, Scorpion, Devs, Devs, Modern Family, Modern Family, Modern Family, 
Modern Family, Modern Family, Modern Family, etc.. 

Вы поняли. На каждое шоу - один выход. Не для каждого файла.

Может быть в другом макете. На самом деле это не имеет значения (хотя я бы предпочел макет выше)

Я пробовал использовать grep, но просто не могу этого сделать. Итак, я в основном спрашиваю: у вас есть идея, как я могу получить результат выше?

Спасибо.

2
задан 23 December 2020 в 18:37

1 ответ

Предполагая, что разделителем между заголовком серии и остальной частью имени файла является согласованный пробел-дефис-пробел, вы можете сделать что-то вроде этого с awk:

find . -type f -name '*.srt' ! -name '*.en.srt' -printf '%f\0' | 
  awk -v RS='\0' -F ' - ' '!seen[$1]++{print $1}' | paste -sd,

The !seen[$1] конструкция дедуплицирует результаты. Последняя команда paste превращает вывод из списка, разделенного новой строкой, в список, разделенный запятыми.

1
ответ дан 23 December 2020 в 15:38

Другие вопросы по тегам:

Похожие вопросы: