У меня большой список заказанных файлы с таким именем (видео)
S1-E18-(Date)-(Title)-(Random numbers).mp4
Вот пример списка
S1-E1-20100526-title-of-video-1400316375.mp4
S1-E3-20100547-title-of-video-15457547.mp4
S10-E5-20100463-title-of-video-14467457.mp4
. В этом случае легко увидеть, что файлы S1-E2
и S10-E4
являются отсутствует.
но если у меня большой список, как мне найти недостающие файлы.
(Оставьте номер сезона S1, S2
) просто нужно проверить E
означает номер эпизода
Самый большой из существующих файлов - S50-E2184
и
Самый маленький из существующих файлов - S1-E1
Используя awk:
$ awk -F- '{n = substr($2, 2)} (n - prev) != 1 {for (i = prev + 1; i < n; i++) print i} {prev = n}' input-file
2
4
-F -
устанавливает разделителя полей на -
(так S1
, E1
, и т.д. станьте различными полями).n = substr($2, 2)
), путем взятия всего кроме первого символа от второго поля ($2
).(n - prev) != 1
), мы печатаем все промежуточные числа.prev
для следующего повторения.Если вывод не отсортирован, разделите извлечение и проверку для вставки a sort
промежуточный:
awk -F- '{print substr($2, 2)}' input-file | sort -n | awk '{n=$1} (n - prev) != 1 {for (i = prev + 1; i < n; i++) print i} {prev = n}'
Немного больше прямого сценария. Сценарий предполагает, что последний эпизод существует и извлекает свое число эпизода. Затем это выполняет итерации по [1.. в последний раз] и проверка существование всех промежуточных эпизодов. Обратите внимание, что это не работало бы на эпизоды, пронумерованные с продвижением, обнуляет.
#!/bin/bash
if [ -z "$1" ]; then
echo "please specify season prefix"
fi
# extract last episode number
last=`ls $1-*.* -1 --reverse | head -n 1 | grep --only-matching "E[[:digit:]+]" | cut -c 2-`
for ((i=1; i<=$last; i++)); do
if [ ! -f $1-E$i-*.* ]; then
echo "missing episode $i"
fi
done
Сценарий берет сезонный префикс в качестве своего первого аргумента, т.е. S1