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
ssignifica procurar texto para substituir. - A expressão regular
/\d+/corresponde a um ou mais dígitos (+) (\d). Isso corresponde ao seu0001,0002e 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
/esignifica avaliar o texto de substituição como código.
(Tente executá-lo com apenas/em vez de/eno final, mas certifique-se de manter o-nflag! )
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á?
-
sprintfretorna o texto formatado. O primeiro argumento é a string de formato na qual os valores são colocados.%04dconsome o primeiro argumento e o formata como um inteiro de 4 caracteres de largura.%4domitiria zeros à esquerda, portanto,%04dé necessário. Não sendo coberto por%,csignifica apenas uma letra literalc. Então%dconsome o segundo argumento e o formata como um inteiro (com formatação padrão). -
int(($& - 1) / 2) + 1subtrai 1 do número extraído do nome do arquivo original, divide por 2, trunca a parte fracionária (intfaz isso) e, em seguida, adiciona 1. Essa aritmética envia0001e0002a0001,0003e0004a0002,0005e0006a0003e assim por diante. -
2 - $& % 2toma 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 envia0001a1,0002a2,0003a1,0004a2e 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.)