Como renomear um conjunto de ficheiros para nomes distintos

Tive recentemente a necessidade de renomear um conjunto bastante alargado de ficheiros para um nome que fosse constituído por uma parte fixa e uma outra incremental com o objectivo de no final ter um nome distinto por ficheiro. Exemplo: Renomear os ficheiros

testeaaa.txt

olaabc.txt

qualquercoisa.txt

para

ficheiro1.txt

ficheiro2.txt

ficheiro3.txt.

 

O Explorador do Windows permite renomear ficheiros em bloco através da interface. Para isso basta seleccionar todos os ficheiros que se pretende renomear, clicar com o botão direito do rato e escolher a opção de contexto “Renomear”. Esta solução para o meu caso específico não era eficaz porque os ficheiros ficariam com o seguinte aspecto:

ficheiro (1).txt

ficheiro (2).txt

ficheiro (3).txt

O problema deste método é a existência de um espaço após o nome “ficheiro” e o número incremental encontrar-se dentro de parêntesis.

 

Em seguida lembrei-me do comando REN que permite renomear ficheiros. A sintaxe deste comando é bastante simples:

RENAME [unidade:][caminho]nomedeficheiro1 nomedeficheiro2.
REN [unidade:][caminho]nomedeficheiro1 nomedeficheiro2.

 

O problema que me faltava resolver era como é que poderia gerar a parte incremental para o nome do ficheiro….

Para tornar o nome “único” lembrei-me que poderia utilizar a notação 8.3 dos nomes dos ficheiros isto porque para evitar duplicação de nomes o sistema operativo coloca após o 6 caracter um valor incremental.

Para obter apenas os nomes dos ficheiros de uma pasta basta executar o comando:

dir /b

Para obter o nome dos ficheiros na notação 8.3 executa-se:

dir /x

O problema desta abordagem consiste na complexidade de intercalar estes dois resultados, ou seja, executar de uma só assentada a operação de renomeação de ficheiros.

Após diversas experiências concluí que não era viável ir por este caminho pois não existe nenhuma forma simples (e sem recurso a aplicações de terceiros) de intercalar estes dois resultados de forma a produzir um simples comando para fazer alterações em batch.

 

E agora a solução:

A solução para o meu problema consiste em duas pequenas batch files:

Contador.bat (incrementa o valor de uma variável e orquestra a execução da operação de renomeação)

MudaNome.bat (executa a mudança do nome com base na informação proveniente da bacth “Contador.bat

 

Conteúdo do ficheiro “Contador.bat

set /a contador=0

for %%f in (*.txt) do call MudaNome2.bat "%%f"

 

Conteúdo do ficheiro “MudaNome.bat

set /a contador=%contador%+1
ren "%1" ficheiro%contador%.txt

 

Se tiverem curiosidade em saber mais sobre os comandos internos usados basta na linha de comandos executar:

set /?

for /?

call /?

 

Provavelmente a forma mais elegante de resolver este problema seria criar um pequeno script em PowerShell, no entanto como ainda não me habituei ao PowerShell e passei (demasiados) anos a criar batch files, optei por esta forma mais arcaica (mas que funciona).

 

 

Recursos externos:

Guia de referência dos comandos de linha do Windows

http://technet.microsoft.com/pt-br/library/cc754340(WS.10).aspx

Guia de referência rápida do PowerShell

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=7097

Literatura no MSDN para quem quer iniciar-se no PowerShell

http://msdn.microsoft.com/en-us/library/aa973757(VS.85).aspx

One thought on “Como renomear um conjunto de ficheiros para nomes distintos

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s