Eu tenho esse script que extrai um quadro de vários mp4
vídeos e os armazena comopng
for i in *.mp4; do
[ -f "$i" ] || break
number=$(echo "$i" | grep -o -E '[0-9]+')
name=frame"$number".png
ffmpeg -i "$i" -ss 00:01:00.000 -vframes 1 "$name"
done
os vídeos são nomeados como video1.mp4
, video2.mp4
, etc. Como o loop tira os vídeos fora de ordem, extraio o número do vídeo para gerar o nome do arquivo de saída.
Isso está funcionando muito bem, mas os nomes dos png
arquivos são assim:
frame1?4.png
, frame3?4.png
, frame3?4.png
...
por que o ?4
?
ah, vejo agora que o 4 vem do 4 no mp4. Como faço para obter apenas o primeiro número?
Isso
?
é apenas uma saída de caractere de espaço reservadols
para representar o caractere de nova linha que você incorporou ao nome do arquivo.iria produzir:
Como existem duas sequências de 1 ou mais dígitos decimais nesse nome de arquivo.
Em vez disso, você poderia fazer:
O que extrairia a sequência de dígitos decimais mais à direita no nome do arquivo sem sua extensão e evitaria a execução de vários comandos para cada arquivo.
Observe que esse código usa apenas a sintaxe sh POSIX padrão, portanto, você não precisa
bash
executá-lo. Combash
ou outrosksh93
shells semelhantes, se você souber que o nome raiz do arquivo contém apenas uma sequência de dígitos, também poderá usar:Com
bash
recursos específicos:Extrairia a sequência de dígitos mais à esquerda no nome raiz.
Com
zsh
:Você identificou corretamente que o
4
vem da.mp4
extensão no nome do arquivo. O ponto de interrogação provavelmente estáls
exibindo a nova linhagrep -o
inserida entre cada correspondência (este é um dos motivos para não confiar nos nomes de arquivols
exibidos, a propósito).Para extrair o primeiro dígito, ou melhor, o último dígito antes da
.mp4
extensão, você pode fazerIsso primeiro remove a extensão do nome
i
e, em seguida, remove todos os não numerais desde o início.