рекурсивно генерировать кадры из видео во вложенных каталогах, используя zsh и ffmpeg - PullRequest
0 голосов
/ 13 января 2019

Следующая команда выполняет то, что мне нужно, если все mp4 находятся в одном каталоге:

for i in *.mp4; do ffmpeg -i "$i" -vf fps=0.5 "$i-%d.jpg"; done

* Э.Г. 1007 *

1.mp4 2.mp4

Однако мои они теперь находятся в папках в одном каталоге, например:

dir1/1.mp4
dir2/2.mp4

Как я могу изменить эту команду, чтобы рекурсивно вводить каждый каталог и выполнять ffmpeg для каждого видео, которое он находит в папке?

Конечный результат должен быть:

dir1
    1.mp4
    1-1.jpg
    1-2.jpg
    1-3.jpg

dir2
    2.mp4
    2-1.jpg
    2-2.jpg
    2-3.jpg

1 Ответ

0 голосов
/ 15 января 2019

С zsh вы можете рекурсивно сопоставлять каталоги с глобусом **, если включена опция EXTENDED_GLOB. Вы можете включить опции с помощью встроенного setopt (например, в вашем ~/.zshrc):

setopt extendedglob

Глобус ** соответствует нулю или нескольким каталогам. Так что **/*.mp4 будет соответствовать dir1/1.mp4 и dir2/2.mp4 в вашем примере. Предполагая, что ffmpeg допускает полные пути в обоих параметрах, где вы используете $i, больше ничего не нужно менять:

for i in **/*.mp4; do ffmpeg -i "$i" -vf fps=0.5 "$i-%d.jpg"; done

Начиная с zsh 5.2, вы также можете дополнительно установить GLOB_STAR_SHORT, что позволяет сократить **/*.mp4 до **.mp4.

for i in **.mp4; do ffmpeg -i "$i" -vf fps=0.5 "$i-%d.jpg"; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...