
У меня есть большой список файлов с именами (видео)
Мне удалось записать все имена файлов в текстовый файл. Теперь у меня есть текстовый файл с множеством имен файлов (по одному эпизоду на строку). Теперь мне нужно что-то, что может прочитать этот текстовый файл и сказать мне, какой E
номер эпизода отсутствует.
S1-E18-(Date)-(Title)-(Random numbers).mp4
Вот пример списка
S1-E1-20100526-title-of-video-1400316375.mp4
S1-E3-20100517-title-of-video-15457547.mp4
S10-E5-20100421-title-of-video-14467457.mp4
S5-E7-20120912-title-of-video-17467457.mp4
В этом случае легко увидеть, что файлы S1-E2
отсутствуют S10-E4
. Но если у меня большой список, как мне найти недостающие файлы? (Оставьте номер сезона S1, S2
) просто нужно проверить E
, означает ли это номер эпизода
Самый большой номер существующего файла равен S50-E2184
, а самый маленький номер существующего файла равенS1-E1
решение1
Сохраните все имена в файле с именем «file_with_list_of_files» и выполните следующую команду в терминале Linux/Unix [я пробовал в терминале Mac]:
cat file_with_list_of_files | sed 's/^[A-Z][0-9]*-//g' | grep -v "^E"
-- или --
cat file_with_list_of_files | awk -F- '{print $2}' | grep -v "^E"
Это список всех файлов, имена которых не содержат E после первого - (дефис). Вы также можете найти другие лучшие способы сделать это.
решение2
Подготовьте файл со всеми подписями эпизодов. Вы не сказали нам, сколько эпизодов в каждом сезоне, но вам, очевидно, нужно это знать. Вот как вы готовите файл:
>all_episodes # just to empty the file which may or may not exist printf 'S1-E%s\n' {1..3} >>all_episodes # 3 episodes in season 1 printf 'S2-E%s\n' {1..5} >>all_episodes # 5 episodes in season 2 printf 'S3-E%s\n' {1..8} >>all_episodes # and so on printf 'S50-E%s\n' {1..2184} >>all_episodes
Это предполагает, что каждый сезон начинается с собственного эпизода номер один (ваш вопрос не ясен). Файл состоит из строк в форме
S<n>-E<m>
, напримерS2-E3
, .Создайте файл собственных эпизодов в той же форме:
cut -d - -f -2 your_current_list >owned_episodes
Команда принимает
-
какгelimiter и возвращает фрагменты строки дофполе номер 2 из вашего текущего списка.Рассматривать
owned_episodes
как шаблоны и фильтроватьall_episodes
для поиска строк без каких-либо шаблонов:grep -vxFf owned_episodes all_episodes
Обратите внимание, что мы используем
-x
здесь; суть в том, чтоS50-E3
не должно совпадатьS50-E31
.-F
в вашем случае это не обязательно, нов общемследует использовать его при подаче фиксированных строк.параметрыявляются:-F
Сопоставление с использованием фиксированных строк. Обрабатывать каждый указанный шаблон как строку, а не как регулярное выражение. [...]-f pattern_file
Считайте один или несколько шаблонов из файла, указанного в имени путиpattern_file
. [...]-v
Выберите строки, не соответствующие ни одному из указанных шаблонов. [...]-x
<newline>
Совпадающими считаются только те входные строки, в которых все символы строки, за исключением завершающего, соответствуют всей фиксированной строке или регулярному выражению.