O utilitário rename, escrito em Perl, pelo próprio Larry Wall, permite alterar os nomes de vários arquivos em lote, dentro de condições e regras que você mesmo pode estabelecer.
Normalmente, quando queremos renomear um arquivo ou diretório, no GNU/Linux, usamos o comando mv (move).
Quando o trabalho envolve uma grande quantidade de arquivos, o rename oferece mais flexibilidade, como ferramenta.
Vale aprender a utilizá-lo — até por que é uma maravilha se for integrado a algum script.
Como usar o comando rename
O utilitário, tal como o seu nome indica, renomeia múltiplos arquivos ou grupos de arquivos.
Com o uso de expressões Perl, o rename pode alterar nomes de arquivos para “tudo” maiúsculas/minúsculas, entre outras coisas.
No exemplo. que segue, vou criar 4 arquivos para usar nos meus exemplos, com o comando touch:
touch abril2015.bak junho2015.bak maio2015.bak marco2015.bak
A seguir, renomear todos os arquivos criados, com extensão ‘.bak’ para a nova extensão ‘.backup’. Veja:
rename 's/\.bak$/\.backup/' *.bak
O comando, acima, se divide em dois argumentos:
- No primeiro, temos a expressão em Perl
's/\.bak$/\.backup/'
que substitui .bak por .backup - No segundo, é informado a que arquivos o comando se aplica: todos que têm extensão
.bak
Veja o meu resultado:
ls -l total 4 -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 abril2015.backup drwxrwxr-x 4 justincase justincase 4096 Out 1 16:36 box -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 junho2015.backup -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 maio2015.backup -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 marco2015.backup
Verifique as alterações antes de aplicá-las
Quando se vai executar uma tarefa em lotes e, como consequência, atingir vários arquivos ao mesmo tempo, é interessante ter certeza de que o efeito produzido seja exatamente o que se deseja.
Voltar atrás, depois de renomear dezenas, centenas ou milhares de nomes de arquivos, pode ser muito difícil.
Para isto, o comando rename dispõe de uma opção que simula seus efeitos, mostrando o que seria feito, para você poder avaliar se é o que deseja.
No comando abaixo, será pedido ao rename que simule a alteração das extensões dos arquivos de volta para .bak:
rename -n -v 's/\.backup$/\.bak/' *.backup
A opção ‘-n’, quer dizer no-act, ou seja, pede para que o rename não aja.
A opção ‘-v’, pede para que o programa seja verboso e conte tudo o que está fazendo.
O meu resultado, foi este:
abril2015.backup renamed as abril2015.bak junho2015.backup renamed as junho2015.bak maio2015.backup renamed as maio2015.bak marco2015.backup renamed as marco2015.bak
Note que, ao pedir uma listagem do diretório…
ls -l
… Nada foi feito:
-rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 abril2015.backup drwxrwxr-x 4 justincase justincase 4096 Set 29 16:18 box -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 junho2015.backup -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 maio2015.backup -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 marco2015.backup
Como converter nomes de arquivos de minúsculas para maiúsculas e vice-versa
Para converter de minúsculas para maiúsculas, use a seguinte fórmula:
rename -v 'y/a-z/A-Z/' *.backup
abril2015.backup renamed as ABRIL2015.BACKUP junho2015.backup renamed as JUNHO2015.BACKUP maio2015.backup renamed as MAIO2015.BACKUP marco2015.backup renamed as MARCO2015.BACKUP [/bash] Veja a minha listagem: [bash gutter="false"] ls -l [/bash] [plain gutter="false"] total 4 -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 ABRIL2015.BACKUP drwxrwxr-x 4 justincase justincase 4096 Set 29 16:18 box -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 JUNHO2015.BACKUP -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 MAIO2015.BACKUP -rw-rw-r-- 1 justincase justincase 0 Out 1 11:41 MARCO2015.BACKUP
Para fazer a operação inversa, troque a posição dos caracteres na expressão 'y/a-z/A-Z/'
para 'y/A-Z/a-z/'
.