Como renomear arquivos com contagem?

5

Eu tenho um diretório como este:

randomized_quad015.png
randomized_quad030.png
randomized_quad045.png
randomized_quad060.png
randomized_quad075.png
randomized_quad090.png
randomized_quad1005.png
randomized_quad1020.png
randomized_quad1035.png
randomized_quad1050.png
randomized_quad105.png
randomized_quad1065.png
randomized_quad1080.png
randomized_quad1095.png
randomized_quad1110.png
randomized_quad1125.png
randomized_quad1140.png

e eu quero renomear os primeiros arquivos adicionando 0 na frente do número, como:

randomized_quad0015.png

Mas eu não sei como. Alguma ajuda?

    
por nkint 13.09.2012 / 20:45

4 respostas

4

Como uma alternativa aos vários métodos baseados em Perl em outras respostas, você pode fazer este exemplo em particular, e muitos outros similares com bash :

for i in randomized_quad???.png; do   
  mv $i randomized_quad0${i#randomized_quad}
done

Isso faz um loop sobre os nomes dos arquivos com apenas três caracteres na região numérica, e a expressão variável entre chaves pega cada nome de arquivo, corta "randomized_quad" na frente (com o operador #) e adiciona "randomized_quad0" na frente.

Outros operadores interessantes como este incluem:

  • % - corta algo no final
  • / - pesquisar e substituir ( / para a primeira correspondência, // para todas as correspondências)
  • : - para extrair substrings

Uma lista mais completa com exemplos é aqui . Além disso, observe que eles usam expressões regulares no estilo POSIX, portanto, . corresponderá a qualquer caractere, e não apenas a um "." Se você quer combinar um ".", Você deve "escapar", com uma barra invertida:

TestVariable1="filename.png"
TestVariable2="filename0png"

echo "${TestVariable1%.png}"
> filename

echo "${TestVariable2%.png}"
> filename

echo "${TestVariable1%\.png}"
> filename

echo "${TestVariable2%\.png}"
> filename0png
    
por Aesin 13.09.2012 / 22:47
6

rename é uma ferramenta de linha de comando que permite renomear arquivos, usando um Perl comando para transformar o nome. Um comando Perl que é comumente usado nesta circunstância é s/REGEXP/REPLACEMENT/ .

Se eu interpretar sua pergunta corretamente, você deseja adicionar um 0 à esquerda nos nomes com menos de 4 dígitos, de modo que todos os nomes acabem tendo 4 dígitos. Essa expressão um pouco complicada trata do caso geral em que você tem nomes de arquivo com 1, 2 ou 3 dígitos: alinha todos eles a 4 dígitos. O modificador e no final faz com que a substituição seja interpretada não como uma string, mas como uma expressão Perl. Essa expressão repete o dígito 0 quantas vezes forem necessárias para preencher o número em 4 dígitos.

rename 's/(?=([0-9]+)\.)/"0" x (4 - length())/e' *.png

Se os arquivos que você deseja renomear tiverem três dígitos, existem maneiras mais simples, como

rename 's/[0-9]+\./0$&/' *[!0-9][0-9][0-9][0-9].png

ou

rename 's/(?<=[^0-9])[0-9]{3}\./0$&/' *.png
    
por Gilles 13.09.2012 / 21:09
0

Com uma versão recente do bash você pode escrever:

for f in randomized_quad*.png; do
    if [[ $f =~ [1-9][0-9]* ]]; then
        new=$(printf "randomized_quad%04d.png" ${BASH_REMATCH[0]})
        [[ $f != $new ]] && mv -v $f $new
    fi
done
    
por glenn jackman 13.09.2012 / 22:36
0
rename 's/quad([0-9]{3})\.png/quad0/' randomized_quad*
    
por January 13.09.2012 / 20:52