У меня есть устройство записи с камеры, которое создает структурированную папку с видео, как показано в примере ниже.

Я хочу создать список видеофайлов, но только тех, которые находятся в заданном временном диапазоне. Например: между 8:00 и 17:00 (видео за пределами этого диапазона имеют низкое качество из-за недостаточного освещения)

имя файла имеет следующую структуру: [Папка ДАТЫ] AM | PM/sricam- [дата] - [время] -последовательность # .mp4

в следующем примере фильтр будет перечислять только файл, начинающийся с 8h08:15

/data/20171229AM/sricam-20171229-070814-1514520494.mp4
/data/20171229AM/sricam-20171229-073814-1514522294.mp4
/data/20171229AM/sricam-20171229-080815-1514524095.mp4
/data/20171229PM/sricam-20171229-180815-1513553225.mp4

я обнаружил, что шаблон расширения фигурных скобок может фильтровать числа, но как это сделать во всех подпапках

надеюсь, мои объяснения не слишком запутаны :)

Спасибо

3 ответа3

1

После некоторой попытки и ошибки я обнаружил, что awk более подходит для такой фильтрации

я пришел к этому решению одной линии:

find $PWD -name "*.mp4" |  awk  -F- '{ if ( substr($3,1,2) <= "17" &&  substr($3,1,2) >= "08")  print $0 }'

но позвольте мне объяснить это:

find $PWD -name "*.mp4"   ## find all videos and print full path


awk -F-                   ## tels awk that the separator is dash character : -

Теперь мой пример выходного пути будет разбит на 4 "столбца" (по 3 черточки), и каждый столбец будет доступен через $ n

Таким образом, интересный столбец составляет $ 3, потому что он содержит время

$ 0 = / данные/20171229AM/sricam-20171229-070814-1514520494.mp4

$ 1 = / данные / 20171229AM / sricam

$ 2 = 20171229

$ 3 = 070814

4 доллара США = 514520494.mp4

мы должны выполнить фильтрацию условий: если время между 08 и 17, выведите строку.

substr($3,1,2)          ## take the two first chars from $3 column starting at position 1

substr($ 3,1,2) <= "17"

Обратите внимание на кавычки около 17, это означает "преобразовать в строку" - без этого два условия в операторе if никогда не будут выполнены

print $0        ##   print the whole line (without the splitting)

Спасибо всем за все ваши предложения.

0

Если я неправильно понял то, что вы спрашиваете, вы можете комбинировать символы подстановки так, как вам нравится, включая сопоставление в подкаталогах. Так что это должно делать то, что вы хотите: (хотя я сам не проверял)

/data/*/sricam-*-{08,09,10,11,12,13,14,15,16,17}????-*.mp4

Не было ясно, хотите ли вы исключить видео, начиная с 17:00. Если вам нужно включить 17:00:00, но исключить что-либо после этого (скажем), вы даже можете объединить несколько подстановочных выражений:

/data/*/sricam-*-{08,09,10,11,12,13,14,15,16}????-*.mp4 /data/*/sricam-*-170000-*.mp4

(Обратите внимание на пробел между выражениями.)

0

Bash подстановочные знаки будут тривиально решить это. Любая команда, которая позволяет передавать несколько аргументов имени файла, также позволяет передавать несколько подстановочных знаков.

printf '%s\n' 20171229AM/sricam-20171229-0[89]*.mp4 20171229AM/sricam-20171229-1[01]*.mp4 20171229PM/sricam-20171229-1[2-6]*.mp4

Вы можете использовать те же аргументы, что и драйвер для цикла:

for file in 20171229AM/sricam-20171229-0[89]*.mp4 20171229AM/sricam-20171229-1[01].mp4 20171229PM/sricam-20171229-1[2-6]*.mp4; do
    : things with "$file"
done

Возможно, стоит указать, что оболочка (Bash или что вы используете) расширит символы подстановки в список подходящих файлов перед выполнением каких-либо команд. (Когда совпадений нет, подстановочные знаки будут передаваться дословно, хотя вы можете указать опцию nullglob чтобы в этом случае он просто исчезал.)

Это "глобальные" шаблоны, а не регулярные выражения. У Bash есть расширенная функция globbing, которая ближе к регулярному выражению, но все же не совсем регулярное выражение; но это не обязательно для этой простой задачи.

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