Renomeação de Arquivos em Lote
Adicione prefixos, sufixos, numeração sequencial, busca e substituição, mude o caso, modifique extensões — tudo no seu navegador
Arraste arquivos aqui ou clique no botão abaixo
Qualquer tipo e quantidade de arquivos, processados apenas no seu navegador — nunca enviados
O que é renomeação de arquivos em lote?
Renomeação em lote é a operação de alterar de uma só vez os nomes de um conjunto de arquivos seguindo um conjunto de regras. Cenários comuns: transformar despejos de câmera como IMG_1234.JPG em 2026-06-viagem-001.jpg, prefixar assets de exportação de UI com @2x_, sequenciar recibos digitalizados pela data da nota. A renomeação embutida do Finder do macOS cobre «Localizar e substituir» e o formato «nome + contador», mas não consegue reescrever extensões; a renomeação por Tab no Explorador do Windows só suporta numeração sequencial simples (o PowerRename do PowerToys adiciona regex, mas exige instalação separada). Trabalhos mais complexos costumam exigir aplicativos como ReNamer ou Bulk Rename Utility, ou scripts feitos à mão em PowerShell / shell. Esta ferramenta expõe cada operação — prefixo/sufixo, numeração, busca e substituição, caso, extensão — como um controle visual com pré-visualização ao vivo e detecção de duplicatas. Tudo roda na memória do navegador; nomes de arquivo com códigos de projeto, nomes de cliente e informações pessoais permanecem na máquina do usuário.
Como usar
Passos
- Arraste arquivos para a área de upload, ou clique em "Selecionar arquivos" para escolhê-los — adicionar mais vezes anexa à lista
- Reordene com "Ordenar por nome / tamanho", ou use as setas para cima/para baixo em cada linha para ajustes finos
- Configure as regras nos três cartões: prefixo/sufixo, busca e substituição, numeração, caso, extensão
- A coluna "Novo nome" atualiza ao vivo — azul indica que difere do original, vermelho indica colisão com outro arquivo
- Clique em "Baixar este arquivo" para salvar individualmente, ou em "Baixar como ZIP" para pegar tudo de uma vez
Ordem das regras
- Substitua o nome base primeiro (deixe vazio para manter o original) — útil quando você quer que cada arquivo termine, por exemplo, como "photo" mais um número sequencial, independentemente do nome original
- Em seguida, busca/substituição roda apenas sobre o nome base, nunca sobre a extensão
- A numeração entra depois, como prefixo, sufixo ou substituição completa do nome base
- Prefixo e sufixo envolvem o resultado
- Transformação de caso e tratamento da extensão vêm por último; a extensão é processada de forma independente
Casos de uso
Como funciona
A ferramenta inteira roda sobre as APIs File, Blob e URL.createObjectURL do navegador — cada byte permanece na memória. Quando você arrasta ou seleciona arquivos, o navegador entrega ao JavaScript objetos File (subclasses de Blob) na heap; a ferramenta apenas lê a propriedade `name` de cada arquivo para renomear, sem nunca tocar no conteúdo binário. As regras se aplicam em uma ordem fixa para evitar interferências: primeiro o nome base é determinado (fornecido pelo usuário ou o original), com a extensão dividida em lastIndexOf('.') (arquivos-ponto como .gitignore são tratados apenas como base, sem extensão); depois a busca/substituição roda como String.prototype.split + Array.prototype.join (sem regex — evita correspondência acidental de caracteres especiais); em seguida o número de sequência é calculado via `String(start + i).padStart(pad, '0')` e colocado como prefixo/sufixo/substituição do nome base; prefixo e sufixo envolvem o resultado; a transformação de caso é aplicada à string completa prefixo+base+sufixo de uma só vez, depois que prefixo e sufixo são unidos; a extensão é processada de forma independente (manter/maiúsculas/minúsculas/substituir). A detecção de duplicatas conta cada novo nome em um Map<string, number> durante a pré-visualização; nomes que aparecem mais de uma vez entram em um duplicateSet que a UI destaca em vermelho. Clicar em "Baixar como ZIP" enquanto o conjunto não estiver vazio exibe um toast de erro e aborta o empacotamento — a lista original de arquivos é preservada, então você pode ajustar as regras e tentar novamente. Isso roda dentro de useMemo([files, opts]), de forma que edições nas regras recomputam incrementalmente sem renderizar a lista de arquivos novamente. O download de arquivo único embrulha o File em URL.createObjectURL, dispara um clique sintético em `<a download>` e revoga a URL imediatamente. O empacotamento ZIP importa dinamicamente o JSZip no primeiro clique (~80 KB, sem custo no first-paint), lê o arrayBuffer() de cada arquivo, escreve-o sob o novo nome e chama generateAsync({type:'blob', compression:'DEFLATE', compressionOptions:{level:6}}). DEFLATE é o padrão do ZIP; o nível 6 equilibra taxa e velocidade. O cálculo das regras é O(n) em quantidade de arquivos; o tempo de empacotamento escala com o total de bytes. Navegadores normalmente leem o conteúdo de um File de forma preguiçosa — arrayBuffer() é o momento em que os bytes realmente saem do disco — então mesmo milhares de arquivos enfileirados custam quase nada durante a pré-visualização, com o pico de memória ocorrendo apenas ao "Baixar como ZIP".
- lastIndexOf('.') divide a extensão; se o único ponto está no índice 0 (ex.: .gitignore), o arquivo não tem extensão e o ponto inicial permanece no nome base
- Busca e substituição usa String.prototype.split + Array.prototype.join em vez de replaceAll, evitando interpretação acidental de $1/$& na string de substituição
- padStart(pad, '0') gera o número preenchido com zeros; pad=0 produz o número bruto para casos em que alinhamento não é necessário
- A transformação de caso roda depois que prefixo e sufixo são unidos, normalizando todo o segmento base de uma só vez; a extensão é tratada de forma independente
- A detecção de duplicatas roda dentro de useMemo com um Map; recomputação O(n), e a UI apenas troca uma className das linhas destacadas — sem reconstrução do DOM
- URLs Blob são revogadas imediatamente via URL.revokeObjectURL para liberar o pool de alocação de URLs, já que object URLs reservadas se acumulam rapidamente sob uso intenso
- JSZip é carregado via dynamic import apenas quando o empacotamento é acionado, então os ~80 KB de código nunca afetam o first-paint nem o LCP
- DEFLATE nível 6 é o ponto ideal no navegador; o nível 9 adiciona 1–2% de compressão por 2–3× o tempo e quase não ajuda em imagens/vídeo já comprimidos
Exemplos
Prefixo + numeração de 3 dígitos com zeros à esquerda
Entrada: photo.jpg, sunset.jpg, beach.jpg
Regras: prefix=trip2026_, start=1, pad=3, position=after
Saída:
trip2026_photo001.jpg
trip2026_sunset002.jpg
trip2026_beach003.jpgSubstituir o nome base por completo
Entrada: GH010001.MP4, GH010002.MP4, GH010003.MP4
Regras: base=SceneA_take, start=1, pad=2, position=after, ext=lowercase
Saída:
SceneA_take01.mp4
SceneA_take02.mp4
SceneA_take03.mp4Remover sufixo redundante via busca/substituição
Entrada: report_v1_FINAL.docx, summary_v1_FINAL.docx
Regras: find=_v1_FINAL, replace=(vazio), case=lowercase
Saída:
report.docx
summary.docxSubstituir extensão
Entrada: index.htm, about.htm, contact.htm
Regras: extension=replace, new ext=html
Saída:
index.html
about.html
contact.htmlPrefixo + espaço-para-hífen + minúsculas
Entrada: Banner Image.PNG, Hero Photo.JPG
Regras: prefix=web-, find=(espaço), replace=-, case=lowercase, extension=lowercase
Saída:
web-banner-image.png
web-hero-photo.jpgPerguntas frequentes
Meus arquivos são enviados para um servidor?
Não. Da adição dos arquivos à produção dos novos nomes e ao empacotamento do ZIP, tudo roda localmente no seu navegador. Nenhuma requisição de upload é feita. Você pode confirmar no painel Network do DevTools.
Por que meu .gitignore / .bashrc não é tratado como tendo extensão?
A ferramenta divide pelo último ponto, mas se o único ponto está logo no início (um arquivo-ponto), o nome inteiro é tratado como base — isso evita confundir um marcador de prefixo oculto com uma extensão.
O que acontece se meus novos nomes colidirem?
A lista de pré-visualização destaca duplicatas em vermelho e mostra um selo com a contagem. Clicar em "Baixar como ZIP" enquanto há duplicatas é bloqueado com uma mensagem de erro — sua lista de arquivos não se perde, basta ajustar as regras e tentar novamente. Soluções comuns: habilitar a numeração, aumentar o preenchimento (pad), adicionar prefixo/sufixo.
Pode renomear pastas / preservar o aninhamento?
Ainda não. A versão atual lida com uma única lista plana de arquivos. Para renomeação em lote ciente de diretórios, renomeie os arquivos aqui e depois monte a árvore de diretórios usando a ferramenta ZIP Pack.
A busca e substituição suporta regex?
Não. Usa correspondência literal de strings (split-join) propositalmente, para que os usuários não disparem por engano tokens da string de substituição como $1 ou $& na substituição. A correspondência simples cobre a vasta maioria das necessidades de limpeza.
Quantos arquivos pode lidar?
Não há limite rígido na quantidade — a pré-visualização é praticamente gratuita. O empacotamento é limitado pela memória do navegador: totais muito grandes (vários GB) podem falhar ao alocar um único Blob; nesse caso, divida os arquivos em lotes e empacote cada um separadamente.
O ZIP baixado mostra nomes não-ASCII corrompidos. Por quê?
O JSZip grava nomes de arquivo em UTF-8 por padrão, que extratores modernos (Archive Utility do macOS, Explorador do Windows 11, 7-Zip, WinRAR 5+) leem corretamente. O antigo Explorador do Windows no Win 7/8 ainda pode decodificar mal nomes não latinos — use 7-Zip ou Bandizip no lugar.
Posso desfazer uma renomeação se eu cometer um erro?
As renomeações só acontecem no momento do download — até você clicar em "Baixar como ZIP" ou "Baixar este arquivo", os arquivos originais no disco permanecem intocados. A pré-visualização é totalmente reversível: limpe as regras, edite-as ou remova arquivos individuais da lista. Se você já baixou, basta ajustar as regras e baixar novamente a partir dos mesmos arquivos de origem.