LINUX.ORG.RU

Корректировка имён файлов - нумерация

 , ,


0

2

Доброго времени суток. Есть скрипт, запускающий видеозахват с тв-тюнера посредством ffmpeg. Захват, то останавливается, то снова возобновляется. Необходимо, чтобы выходной файл не переписывался, а создовался новый с добавлением номера. Данный скрипт не устраивает тем, что имена файлов идут vid_1.ts vid_2.ts и в некоторых системах сортировка файлов не всегда правильная (после vid_1.ts идёт vid_11.ts и т. д.). Как можно подправить скрипт, чтобы имена файлов были vid_001.ts vid_002.ts и т. д.

#!/usr/bin/env bash

touch /home/john/Video/vid.ts

name=vid
if [[ -e /home/john/Video/$name.ts || -L /home/john/Video/$name.ts ]] ; then
    i=0
    while [[ -e /home/john/Video/$name\_$i.ts || -L /home/john/Video/$name\_$i.ts ]] ; do
        let i++
    done
    name=$name\_$i
fi

rm /home/john/Video/vid.ts

ffmpeg -i /dev/video0 -c:v libx264 -aspect 4:3 -preset ultrafast -flags +ilme+ildct -top 1 -c:a aac -f mpegts /home/john/Video/$name.ts

Ответ на: комментарий от Kroz

Спасибо, но это не то. Там рассматривается цикл, генерирующий числа, которые надо записать с нулями впереди.
У меня ситуация другая - надо сначала сканировать папку на предмет уже существующих файлов с номерами. Выявить последний и записывать в следующий.
Модифицировал файл с printf, но цикл не читает номера с нулями...

touch /home/john/Video/vid.ts

name=vid
if [[ -e /home/john/Video/$name.ts || -L /home/john/Video/$name.ts ]] ; then
    i=0
    while [[ -e /home/john/Video/$name\_$i.ts || -L /home/john/Video/$name\_$i.ts ]] ; do
        let i++
    done
    name=$name\_$(printf "%02d" $i)
fi

rm /home/john/Video/vid.ts

touch /home/john/Video/$name.ts

выдаёт только vid_00.ts

sspphheerraa ()
Ответ на: комментарий от sspphheerraa

Что-нибудь такое должно подойти (но, возможно, ошибки есть - я не тестировал)

touch /home/john/Video/vid.ts

name=vid
if [[ -e /home/john/Video/$name.ts || -L /home/john/Video/$name.ts ]] ; then
    i=0
    while :
    do
        let i++
        name_with_digits=$name\_$(printf "%02d" $i)
        if [[ -e /home/john/Video/$name_with_digits.ts || -L /home/john/Video/$name_with_digits.ts ]] ; then
		else
			break;
        fi
    done
    
fi

rm /home/john/Video/vid.ts

touch /home/john/Video/$name_with_digits.ts
PeleWin ()
Ответ на: комментарий от sspphheerraa

надо сначала сканировать папку на предмет уже существующих файлов с номерами

Не нужно сканировать.

touch /home/john/Video/vid.ts

name=vid
if [[ -e /home/john/Video/$name.ts || -L /home/john/Video/$name.ts ]] ; then
    i=0
    suffix = "$(printf "%02d" $i)"
    while [[ -e "/home/john/Video/$name\_$suffix.ts" || -L "/home/john/Video/$name\_$suffix.ts" ]] ; do
        let i++
        suffix = "$(printf "%02d" $i)"
    done
    name="$name\_$suffix"
fi

rm /home/john/Video/vid.ts

touch /home/john/Video/$name.ts

Kroz ★★★★★ ()
Ответ на: комментарий от Kroz

Kroz, ругается на неизвестную комманду в 6 строке, если убрать пробелы возле = ,то файлы создаются, но в именах присутствует слэш (vid\_00.ts). Если в строке где name=«$name\_$suffix» убрать кавычки, то как и раньше - создаётся только файл vid_00.ts и всё.

sspphheerraa ()
Ответ на: комментарий от sspphheerraa

Исправил. Проверил, вроде работает. Количество цифр увеличил до трёх, в соответствии с первым комментарием в ветке.

touch /home/john/Video/vid.ts

name=vid
if [[ -e /home/john/Video/$name.ts || -L /home/john/Video/$name.ts ]] ; then
	i=0
	while :
	do
		let i++
		name_with_digits=$name\_$(printf "%03d" $i)
		if [[ -e /home/john/Video/$name_with_digits.ts || -L /home/john/Video/$name_with_digits.ts ]]
		then
			:
		else
			break;
		fi
	done
	
fi

rm /home/john/Video/vid.ts

touch /home/john/Video/$name_with_digits.ts
PeleWin ()