Postagem em destaque

Renomeando arquivos em lote

Renomear arquivos é algo corriqueiro e extremamente simples de ser realizado, principalmente com os gerenciadores de arquivos atuais que permitem ao usuário selecionar uma grande lista de arquivos e definir um novo nome, prefixo ou sufixo de sua preferência.

Apesar de todas essas facilidades há aqueles que optam pela tradicional linha de comando (shell) devido a sua flexibilidade e eficiência.

Para aplicação considere a lista de arquivos a seguir:
arquivo10.txt  arquivo14.txt  arquivo18.txt  arquivo2.txt  arquivo6.txt
arquivo11.txt  arquivo15.txt  arquivo19.txt  arquivo3.txt  arquivo7.txt
arquivo12.txt  arquivo16.txt  arquivo1.txt   arquivo4.txt  arquivo8.txt
arquivo13.txt  arquivo17.txt  arquivo20.txt  arquivo5.txt  arquivo9.txt
Cada documento contém o prefixo 'arquivo' seguido por um número.

Os métodos apresentados abaixo tem como ação alterar o prefixo 'arquivo' de cada documento por 'arq', mantendo as enumerações presentes.

1. Utilizando o comando rename.

O rename é uma ferramenta em perl que permite renomear múltiplos arquivos de acordo com a regra especificada como primeiro argumento e com a seguinte sintaxe:

rename 'perlexpr' arquivos ...
A construção da regra (perlexpr) lembra muito a sintaxe utilizada pelo comando sed.

Comando:
rename 's/^arquivo/arq/' *
O comando deve ser executado dentro do diretório que contém os arquivos a serem alterados ou especificar o caminho completo (suporta glob).

2. Combinado os comandos find, sed e mv. (recursivo)

Nesse método vou utilizar o comando find para listar os arquivos do diretório e redirecionar a saída para o sed que irá construir uma linha de comando válida com mv que será processada posteriormente. O sed tem um papel fundamental na implementação da estrutura utilizando os retrovisores \1 e \3 para separar os elementos: diretório, nome do arquivo e extensão.

Saída:

$ find | sed -rn 's/^(.*\/)(arquivo)([^/]*\.[a-z]+)$/mv "&" "\1arq\3"/p'
mv "./arquivo15.txt" "./arq15.txt"
mv "./arquivo17.txt" "./arq17.txt"
mv "./arquivo5.txt" "./arq5.txt"
mv "./arquivo16.txt" "./arq16.txt"
mv "./arquivo8.txt" "./arq8.txt"
mv "./arquivo9.txt" "./arq9.txt"
mv "./arquivo6.txt" "./arq6.txt"
mv "./arquivo10.txt" "./arq10.txt"
mv "./arquivo7.txt" "./arq7.txt"
mv "./arquivo13.txt" "./arq13.txt"
mv "./arquivo18.txt" "./arq18.txt"
mv "./arquivo20.txt" "./arq20.txt"
mv "./arquivo14.txt" "./arq14.txt"
mv "./arquivo3.txt" "./arq3.txt"
mv "./arquivo19.txt" "./arq19.txt"
mv "./arquivo12.txt" "./arq12.txt"
mv "./arquivo1.txt" "./arq1.txt"
mv "./arquivo11.txt" "./arq11.txt"
mv "./arquivo2.txt" "./arq2.txt"
mv "./arquivo4.txt" "./arq4.txt"

Para executar e renomear os arquivos basta inserir o interpretador de comandos ao final da linha, veja:

Comando:
$ find | sed -rn 's/^(.*\/)(arquivo)([^/]*\.[a-z]+)$/mv "&" "\1arq\3"/p' | $0
Nota: $0 representa o interpretador de comandos atual, podendo ser substituindo por 'bash', 'sh', 'ksh' e etc.
Obs: Por omissão o find busca os arquivos a partir do diretório atual.

Para especificar o nome a ser substituído e o novo nome basta alterar as expressões 'arquivo' e 'arq'.

Saída:

$ ls
arq10.txt  arq12.txt  arq14.txt  arq16.txt  arq18.txt  arq1.txt   arq2.txt  arq4.txt  arq6.txt  arq8.txt
arq11.txt  arq13.txt  arq15.txt  arq17.txt  arq19.txt  arq20.txt  arq3.txt  arq5.txt  arq7.txt  arq9.txt

Participe compartilhando a experiência de perguntar e responder questões pertinentes ao shell script, afim de promover a troca de informações e conhecimentos.
Acesse nosso fórum clicando aqui



Comentários

Contato

Nome

E-mail *

Mensagem *