Renomeia arquivos para adicionar zeros à esquerda em números

6

Eu tentei um monte de exemplos do comando renomear, mas não consigo descobrir a sintaxe para fazer o que eu quero.

Eu tenho vários arquivos rotulados como

File_Ex_1.jpg
File_Ex_2.jpg
File_Ex_3.jpg
File_Ex_4.jpg
...
File_Ex_10.jpg
File_Ex_11.jpg
etc. 

Eu quero alterar apenas alguns deles inserindo um 0 para que os nomes dos arquivos tenham o mesmo número de caracteres.

Por isso, quero que File_Ex_1.jpg vá para File_Ex_01.jpg , File_Ex_2.jpg a File_Ex_02.jpg

Como você faz isso com o comando rename?

Este rename command foi instalado por meio de home-brew em um Mac. Saída de rename -v :

rename -v
Usage:
    rename [switches|transforms] [files]

    Switches:

    -0/--null (when reading from STDIN)
    -f/--force or -i/--interactive (proceed or prompt when overwriting)
Wide character in print at /System/Library/Perl/5.18/Pod/Text.pm line 286.

    -g/--glob (expand "*" etc. in filenames, useful in Windows™ CMD.EXE)
    -k/--backwards/--reverse-order
    -l/--symlink or -L/--hardlink
    -M/--use=*Module*
    -n/--just-print/--dry-run
    -N/--counter-format
    -p/--mkpath/--make-dirs
    --stdin/--no-stdin
    -t/--sort-time
    -T/--transcode=*encoding*
    -v/--verbose

    Transforms, applied sequentially:

    -a/--append=*str*
    -A/--prepend=*str*
    -c/--lower-case
    -C/--upper-case
    -d/--delete=*str*
    -D/--delete-all=*str*
    -e/--expr=*code*
    -P/--pipe=*cmd*
    -s/--subst *from* *to*
    -S/--subst-all *from* *to*
    -x/--remove-extension
    -X/--keep-extension
    -z/--sanitize
    --camelcase --urlesc --nows --rews --noctrl --nometa --trim (see manual)
    
por toombzie 22.02.2017 / 22:02

3 respostas

10

Tente com isso:

rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg

Exemplo:

$ ls
Device_Ex_10.jpg  Device_Ex_1.jpg  Device_Ex_4.jpg  Device_Ex_7.jpg
Device_Ex_11.jpg  Device_Ex_2.jpg  Device_Ex_5.jpg  Device_Ex_8.jpg
Device_Ex_12.jpg  Device_Ex_3.jpg  Device_Ex_6.jpg  Device_Ex_9.jpg
$ rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg
$ ls
Device_Ex_01.jpg  Device_Ex_04.jpg  Device_Ex_07.jpg  Device_Ex_10.jpg
Device_Ex_02.jpg  Device_Ex_05.jpg  Device_Ex_08.jpg  Device_Ex_11.jpg
Device_Ex_03.jpg  Device_Ex_06.jpg  Device_Ex_09.jpg  Device_Ex_12.jpg

Eu peguei a referência daqui: link

Aqui adaptado à sua implementação rename específica.

    
por 22.02.2017 / 22:17
2

Com a versão de renomear que você parece estar usando, o seguinte a expressão deve fazer a transformação que você solicita (exammple com um diretório contendo arquivos chamados File_Ex_{1..11}.jpg ):

$ rename -n -e 's/_(\d\.)/_0$1/g' -- *.jpg
'File_Ex_1.jpg' would be renamed to 'File_Ex_01.jpg'
'File_Ex_2.jpg' would be renamed to 'File_Ex_02.jpg'
'File_Ex_3.jpg' would be renamed to 'File_Ex_03.jpg'
'File_Ex_4.jpg' would be renamed to 'File_Ex_04.jpg'
'File_Ex_5.jpg' would be renamed to 'File_Ex_05.jpg'
'File_Ex_6.jpg' would be renamed to 'File_Ex_06.jpg'
'File_Ex_7.jpg' would be renamed to 'File_Ex_07.jpg'
'File_Ex_8.jpg' would be renamed to 'File_Ex_08.jpg'
'File_Ex_9.jpg' would be renamed to 'File_Ex_09.jpg'

(Remova o sinalizador -n para realmente renomear.)

O argumento para -e é uma expressão de pesquisa e substituição de Perl; Onde _(\d\.) corresponde a um sublinhado seguido por um único dígito e depois a um ponto e substitui o sublinhado por _0 , inserindo assim um zero. $1 é uma referência inversa ao grupo entre parênteses, o dígito e ponto, e deixa inalterado no novo nome do arquivo.

    
por 23.02.2017 / 14:46
0

Embora isso possa ser feito com o comando prename , eu gostaria de fornecer uma alternativa em python para isso:

$ ls
File_Ex_1.jpg  File_Ex_2.jpg  File_Ex_3.jpg  File_Ex_4.jpg

$ ./pad_zeros.py *                                                                                                       

$ ls
File_Ex_01.jpg  File_Ex_02.jpg  File_Ex_03.jpg  File_Ex_04.jpg  pad_zeros.py*

O script pad_zeros.py é simples:

#!/usr/bin/env python
import sys,os,re

for file in sys.argv[1:]:
    if __file__ in file: continue
    words = re.split('_|\.',file)
    words[-2] = words[-2].zfill(2)
    new_name = "_".join(words[:-1]) + "." + words[-1]
    os.rename(file,new_name)

Aceita argumentos na linha de comando, faz iterações sobre eles e preenche os zeros usando o comando .zfill() (nesse caso específico, para dois caracteres). Como estamos operando em todos os arquivos na mesma pasta, glob-star pode ser usado.

    
por 23.02.2017 / 00:59

Tags