Renomear arquivos com números pares

2

Eu tenho uma coleção de imagens que são páginas digitalizadas de livros. Eles totalizam cerca de 10.000 páginas. Os livros foram impressos de forma bilíngüe, com o texto e a tradução nas páginas opostas. A tradução foi descartada e há apenas as páginas de texto originais, que são as páginas pares.

Eu preciso dos nomes dos arquivos para incluir o número correto da página, enquanto atualmente eles estão em uma sequência simples. Feliz em usar rename ou similar.

Para explicitar, atualmente temos a numeração de arquivos do formulário:

1-001.png
1-002.png
1-003.png
 ...

Onde o primeiro número 1 é o número do volume; isso deve permanecer inalterado. O segundo número é o número da página, e isso precisa ser alterado assim:

1-002.png
1.004.png
1-006.png
 ...
    
por user2360490 01.12.2014 / 03:07

2 respostas

4

Aqui está o comando renomear:

rename -n 'our $i=2;s/^(\d+)-(\d+)/sprintf("$1-%04d", $i*$2)/e' *.png

Resultado:

1-001.png renamed as 1-0002.png
1-002.png renamed as 1-0004.png
1-003.png renamed as 1-0006.png
1-004.png renamed as 1-0008.png
1-005.png renamed as 1-0010.png
...
2-001.png renamed as 2-0002.png
2-002.png renamed as 2-0004.png
2-003.png renamed as 2-0006.png
2-004.png renamed as 2-0008.png
2-005.png renamed as 2-0010.png
-n, --no-act 
            No Action: show what files would have been renamed.

Com our $i , eu defini uma variável global perl e defini seu valor com 2 .

(\d+)-(\d+) : (\d+) está correspondendo ao início do nome dos arquivos com um ou mais números de dígitos e os torna como captura de grupo e um - ; em seguida, novamente com (\d+) correspondendo a qualquer número após traço ( - ) no nome dos arquivos e torná-lo como captura de grupo.

^ no início de ^(\d+)-(\d+) evita / ignora renomear arquivos se eles não forem iniciados ( ^ ) com números como a11.001.png e renomear arquivos apenas se começarem com digit-digit.png . / p>

sprintf("$1-%04d", $i*$2) : Primeira captura de grupo de impressão com índice $1 (ou sua referência anterior) (consulte primeiro (\d+) em ^(\d+)-(\d+) ) e imprima novo valor calculado do grupo $2 com no máximo 4 campos de largura ( %4d ) e preencher campos vazios com 0s ( %04d ).

Observação: por que usei o comando %04d in sprintf , porque quando você deseja renomear 1-001.png para 1-002.png , o arquivo 1-002.png já existe e não é possível renomeá-lo. Então, adicionei um zero extra à frente do segundo campo para evitar esse erro.

Ou como @muru sugere, você pode usar referências anteriores em vez da variável global

rename -n 's/^(\d+)-(\d+)/sprintf("$1-%04d",$2*2)/e' *.png

$1 é a referência de volta do primeiro (\d+) e $2 é a referência de retorno do segundo (\d+) . Observe que você precisa usar um par de parênteses (group) para torná-lo uma captura de grupo.

No final, você pode remover a opção -n do comando para renomear seus arquivos.

    
por 01.12.2014 / 08:24
0

Trabalhando sob a suposição de que você deseja multiplicar cada número de página por 2,

#!/bin/sh

tmpext=tmpext # temporary extension to avoid clobbering existing files

# double the page number and change .png to tmpext
for page in ./*-[[:digit:]][[:digit:]][[:digit:]].png; do
  vol=${page%-*}
  num=${page#$vol-}
  num=${num%.png}
  zeroes=${num%%[!0]*}
  num=${num#$zeroes}
  tmppage=${vol}-$(printf %.3d $((num * 2))).$tmpext
  mv -vi "$page" "$tmppage"
done

# move .tmpext back to .png
for tmppage in ./*."$tmpext"; do
  mv -vi "${tmppage}" "${tmppage%$tmpext}png"
done
    
por 01.12.2014 / 04:30

Tags