Issue
Мне нужно отфильтровать файлы из выходных данных по первым 12 символам и отправить в качестве вывода команду ffmpeg
, а затем сделать это снова для следующего цикла.
Входной файл.
VID_20190920_195919.mp4
VID_20190920_200821.mp4
VID_20190920_221640.mp4
VID_20190921_141929.mp4
VID_20190921_142236.mp4
Отфильтрованный вывод в 1-м цикле (по первым 12 символам, поэтому по VID_20190920
).
VID_20190920_195919.mp4
VID_20190920_200821.mp4
VID_20190920_221640.mp4
Отфильтрованный вывод во 2-м цикле (по первым 12 символам, поэтому по VID_20190921
).
VID_20190921_141929.mp4
VID_20190921_142236.mp4
и т. Д.
Каждый цикл (список отфильтрованных файлов) необходимо экспортировать в cycle.txt
, затем файл обрабатывается этой командой.
ffmpeg -f concat -i cycle.txt -c copy VID_YYYYMMRR.mp4
Затем очистите cycle.txt
с помощью > cycle.txt
и сделайте это снова для следующего цикла.
Или лучший способ сделать это?
Спасибо.
Система
Linux local 5.0.0-29-lowlatency #31-Ubuntu SMP PREEMPT Thu Sep 12 14:13:01 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Я думаю, что это может сделать:
unique=($(cat foo | cut -c 5-12 | sort -u))
for i in "${!unique[@]}"; do
find *${unique[$i]}* > cycle_$i
done
<час> Создают массив только с датами:
unique=($(cat foo | cut -c 5-12 | sort -u))
<час> Цикл через массив и находит файлы, которые соответствуют каждой дате и сохраняют вывод в файл с именем индекса:
for i in "${!unique[@]}"; do
find *${unique[$i]}* > cycle_$i
done
<час> Результат:
cycle_0.txt
VID_20190920_195919.mp4
VID_20190920_200821.mp4
VID_20190920_221640.mp4
cycle_1.txt
VID_20190921_141929.mp4
VID_20190921_142236.mp4
Принятие Ваших видеофайлов находится в том же каталоге, можно использовать эти команды удара:
for i in VID_*.mp4; do
echo ${i%_*}
done | sort -u | while read f; do
ffmpeg -f concat -i <(echo ${f}*) -c copy "${f}.mp4"
done
сценарий получает все видео VID_*.mp4
и разделяет суффикс _XXX.mp4
с имени.
Затем циклы через все уникальные имена в форме VID_XXX
и выполняются ffmpeg
.
В конце, это решение работы.
chars=12
for file in $(find . -name '*.mp4' -printf "%f\n" | sort -n | cut -c 1-$chars | uniq)
do
find . -name '*.mp4' | grep $file | sed "s/^/file '/" | sed "s/$/'/" | sort -n > filein
ffmpeg -v quiet -safe 0 -f concat -i filein -c copy $file.mp4
done
Кажется, что экспорт в файл необходим. Или нет?
Информация
chars
, количество тех же символов для присоединения.
можно добавить -mindepth -maxdepth
к find
команда для глубины папки.