2

У меня большой список файлов с именами (видео)

Мне удалось записать все имена файлов в текстовом файле. Теперь у меня есть текстовый файл с большим количеством имен файлов (один эпизод на строку). Теперь мне нужно что-то, что может прочитать этот текстовый файл и сказать мне, какой номер серии 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

2 ответа2

0
  1. Подготовьте файл со всеми подписями эпизода. Вы не сказали нам, сколько эпизодов в каждом сезоне, но вам, очевидно, нужно знать. Вот как вы готовите файл:

    >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 .

  2. Создайте файл принадлежащих эпизодов в той же форме:

    cut -d - -f -2 your_current_list >owned_episodes
    

    Команда принимает - в качестве фрагментов Д elimiter и возвращает линию к й IELD № 2 из текущего списка.

  3. Обрабатывайте 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> чтобы соответствовать целой фиксированной строке или регулярному выражению, чтобы они соответствовали строкам.

0

Сохраните все имена в файле с именем "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 после первого - (дефис). Вы можете найти и другие лучшие способы сделать это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .