Preenchendo um número em um nome de arquivo para um tamanho fixo

6

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
…
    
por ayca 26.09.2011 / 13:15

5 respostas

6

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
    
por 26.09.2011 / 16:22
5

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'
    
por 27.09.2011 / 01:42
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.

    
por 26.09.2011 / 13:35
3

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
    
por 26.09.2011 / 13:47
2

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.

    
por 27.09.2011 / 04:06

Tags