Isso também funcionará:
for f in *.png; do
int='basename $f .png | cut -d '.' -f 2'
new_name='printf "file.%0.4i.png\n" $int'
[ ! -f $new_name ] && mv $f $new_name
done
Eu tenho um diretório de arquivos como:
file.1.png
file.2.png
…
file.10.png
…
file.1000.png
file.1001.png
…
Como posso preencher o número para 4 dígitos? Deve acabar assim:
file.0001.png
file.0002.png
…
file.0010.png
…
file.1000.png
file.1001.png
…
Isso também funcionará:
for f in *.png; do
int='basename $f .png | cut -d '.' -f 2'
new_name='printf "file.%0.4i.png\n" $int'
[ ! -f $new_name ] && mv $f $new_name
done
Um truque simples, se você quiser um script simples e portátil, é começar a contar em 10001 e remover o dígito inicial.
for x in file.*.png; do
n=${x%.*}; n=${n##*.}
n=$((n + 10000))
mv "$x" "${x%.*.*}.${n#1}.${x##*.}"
done
Com o zsh, usando zmv e o l
bandeira de expansão do parâmetro :
setopt extended_glob
autoload zmv
zmv '(file).([0-9]##).(png)' '$1.${(l:4::0:)2}.$3'
Tente o seguinte:
for f in *.png
do
foo='0000'${f#file.} #remove "file." and prepend 0000
foo=${foo:(-8)} #last eight characters
echo mv $f file.$foo
done
Remova o eco se estiver satisfeito com a saída.
Se você tiver o comando rename
do pacote Perl (em oposição ao do pacote util-linux):
rename 's/(\d+)/sprintf"%04d",$1/ge' file.*.png
Alternativa baseada no comentário de glenn jackman, que sugere uma solução portátil envolvendo Perl. Como o Perl tem sua própria função rename
, não há mais necessidade do mv
externo:
ls -1 file.*.png | perl -ne 'chomp;($n=$_)=~s/(\d+)/sprintf"%04d",$1/ge;rename$_,$n'
Esse código é mais fácil de aprimorar para reproduzir os extras adicionados pelo comando rename
external: ignore se o novo nome do arquivo for idêntico ao antigo e pule se já houver um arquivo com o novo nome:
ls -1 | perl -ne 'chomp;($n=$_)=~s/(\d+)/sprintf"%04d",$1/ge;rename$_,$n if$_ ne$n&&!-f$n'
Com alguma adaptação, uma solução sem loop pode ser obtida mesmo com Sed:
ls -1 file.*.png | sed -r '/[0-9]{4}/d;h;:p;/[0-9]{4}/!s/([0-9]{1,3})/0/;tp;G;s/(.+)\n(.+)/mv /' | sh
Já existem algumas respostas aqui, mas pensei em lançar uma simples
rename 'file.' 'file.000' file.?.png
rename 'file.' 'file.00' file.??.png
rename 'file.' 'file.0' file.???.png
O utilitário rename
é padrão em todas as distros que eu conheço. Não é tão chique quanto algumas das outras soluções aqui, mas simples é fácil de lembrar.
A primeira linha leva file.1.png
e converte para file.0001.png
.
O segundo converte file.10.png
em file.0010.png
e o terceiro em file.100.png
em arquivo.0100.png.
Os 4 dígitos já estão prontos.