rename
realiza renomeação em massa e pode fazer a aritmética de que você precisa.
Diferentes distribuições GNU / Linux possuem diferentes comandos chamados rename
, com diferentes sintaxes e capacidades. No Debian, Ubuntu e alguns outros sistemas operacionais, rename
é o utilitário de renomeação Perl prename
. É bem adequado para essa tarefa.
Primeiramente, eu recomendo que você informe rename
para mostrar o que ele faria, executando-o com o -n
flag:
rename -n 's/\d+/sprintf("%04dc%d", int(($& - 1) \/ 2) + 1, 2 - $& % 2)/e' ome????.tif
Isso deve mostrar:
rename(ome0001.tif, ome0001c1.tif)
rename(ome0002.tif, ome0001c2.tif)
rename(ome0003.tif, ome0002c1.tif)
rename(ome0004.tif, ome0002c2.tif)
rename(ome0005.tif, ome0003c1.tif)
rename(ome0006.tif, ome0003c2.tif)
rename(ome0007.tif, ome0004c1.tif)
rename(ome0008.tif, ome0004c2.tif)
rename(ome0009.tif, ome0005c1.tif)
rename(ome0010.tif, ome0005c2.tif)
rename(ome0011.tif, ome0006c1.tif)
rename(ome0012.tif, ome0006c2.tif)
Supondo que é isso que você quer, vá em frente e execute-o sem o sinalizador -n
(ou seja, apenas remova -n
):
rename 's/\d+/sprintf("%04dc%d", int(($& - 1) \/ 2) + 1, 2 - $& % 2)/e' ome????.tif
Esse comando é um pouco feio - embora ainda mais elegante do que usar um loop em seu shell - e talvez alguém com mais experiência em Perl do que eu tenha postado uma solução mais bonita.
Eu recomendo o tutorial do Oli Bulk renomeando arquivos no Ubuntu; a mais breve das introduções ao comando rename , para uma introdução suave à escrita dos comandos rename
.
Como esse comando rename
específico funciona:
Veja o que o s/\d+/sprintf("%04dc%d", int(($& - 1) \/ 2) + 1, 2 - $& % 2)/e
faz:
- O principal
s
significa procurar texto para substituir. - A expressão regular
/\d+/
corresponde a um ou mais dígitos (+
) (\d
). Isso corresponde ao seu0001
,0002
e assim por diante. - O comando
sprintf("%04dc%d", int(($& - 1) / 2) + 1, 2 - $& % 2)
foi criado.$&
representa a correspondência./
normalmente termina o texto de substituição, mas\/
faz um literal/
(que é divisão, conforme detalhado abaixo). - O trailing
/e
significa avaliar o texto de substituição como código.
(Tente executá-lo com apenas/
em vez de/e
no final, mas certifique-se de manter o-n
flag! )
Assim, seus novos nomes de arquivos são os valores de retorno de sprintf("%04dc%d", int(($& - 1) \/ 2) + 1, 2 - $& % 2)
. Então, o que está acontecendo lá?
-
sprintf
retorna o texto formatado. O primeiro argumento é a string de formato na qual os valores são colocados.%04d
consome o primeiro argumento e o formata como um inteiro de 4 caracteres de largura.%4d
omitiria zeros à esquerda, portanto,%04d
é necessário. Não sendo coberto por%
,c
significa apenas uma letra literalc
. Então%d
consome o segundo argumento e o formata como um inteiro (com formatação padrão). -
int(($& - 1) / 2) + 1
subtrai 1 do número extraído do nome do arquivo original, divide por 2, trunca a parte fracionária (int
faz isso) e, em seguida, adiciona 1. Essa aritmética envia0001
e0002
a0001
,0003
e0004
a0002
,0005
e0006
a0003
e assim por diante. -
2 - $& % 2
toma o restante da divisão do número extraído do nome do arquivo original por 2 (%
faz isso), que é 0 se for par e 1 se for ímpar. Em seguida, ele subtrai isso de 2. Essa aritmética envia0001
a1
,0002
a2
,0003
a1
,0004
a2
e assim por diante.
Por fim, ome????.tif
é um glob que seu shell expande para uma lista de todos os nomes de arquivos no diretório atual que começam com ome
, terminam em .tif
e têm exatamente quatro caracteres entre.
Esta lista é passada para o comando rename
, que tentará renomear (ou com -n
, informar como renomear) todos os arquivos cujos nomes contenham uma correspondência com o padrão \d+
. / p>
- A partir de sua descrição, não parece que você tenha arquivos nesse diretório nomeado dessa forma, mas com alguns caracteres sem dígitos.
- Mas, se você fizer isso, poderá substituir
\d+
por\d{4}
na expressão regular que aparece nos comandos mostrados acima, para garantir que eles não sejam renomeados ou apenas inspecionar cuidadosamente a saída produzida com-n
, que você deveria estar fazendo assim mesmo. - Eu escrevi
\d+
em vez de\d{4}
para evitar tornar o comando mais complexo do que o necessário. (Existem muitas maneiras diferentes de escrevê-lo.)