Como posso renomear uma seqüência de arquivos sem preenchimento de zeros frontais para que eles possam ter preenchimento com zeros frontais?

1

Eu tenho uma sequência de arquivos:

file0.png, file1.png, ..., file10.png,... file100.png, ..., file1000.png, file1001.png, ..., file10000.png

Eu quero fazer um vídeo com o ffmpeg,

ffmpeg -framerate 30 -pattern_type glob -i '*.png' -c:v libx264 out.mp4

A convenção de nomes leva a uma ordem errada dos arquivos lidos na entrada. Como posso resolver isso?

a chamada solução "Como renomeio um monte de arquivos no prompt de comando?" não funciona!

    
por toto 02.11.2015 / 17:48

2 respostas

1

Because archlinux has some problem with the rename util, I booted on a live Ubuntu, and did the rename.

rename 's/\d+/sprintf("%05d", $&)/e' *.png  

Isso foi feito para renomear a sequência de arquivos.

    
por 02.11.2015 / 20:23
0

Inicialmente, olhei os documentos de ffmpeg para ver se os nomes dos arquivos de entrada podem ser especificados em um arquivo próprio, onde você poderia classificá-los como quiser. Mas a documentação não tinha claramente uma opção como essa. Eu posso estar errado, e essa seria minha recomendação se você perceber tal opção.

Então, você deve renomear seus arquivos para entrada na ordem desejada. Suponho que você esteja usando o shell bash, os arquivos estão no mesmo diretório, todos denominados file1.png to file10000.png e você preferiria que eles fossem denominados file00001.png to file10000.png .

#!/bin/bash
for f in file*.png
do
  printf -v n "file%05d.png" "${f:4:-4}"
  mv "$f" "$n"
done

Em uma linha como: for f in file*.png; do printf -v n "file%05d.png" "${f:4:-4}"; mv "$f" "$n"; done

ou talvez apenas:

#!/bin/bash
for (( i=0; i<10000; i++ ))
do
  printf -v n "%05d" $i
  mv "file$i.png" "file$n.png"
done

Em uma linha como: for (( i=0; i<10000; i++ )); do printf -v n "%05d" $i; mv "file$i.png" "file$n.png"; done;

Não tenho certeza do que é mais rápido, mas suspeito que o segundo seria.

    
por 02.11.2015 / 21:21