Используйте bash, как отфильтровать по n символов в цикле `for`

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
0
задан 24 September 2019 в 15:58

3 ответа

Я думаю, что это может сделать:

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
0
ответ дан 23 October 2019 в 10:41

Принятие Ваших видеофайлов находится в том же каталоге, можно использовать эти команды удара:

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.

0
ответ дан 23 October 2019 в 10:41

В конце, это решение работы.

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 команда для глубины папки.

0
ответ дан 23 October 2019 в 10:41

Другие вопросы по тегам:

Похожие вопросы: