Você só pode realizar sua meta declarada se cada pasta nunca tiver mais de um arquivo de um determinado tipo. Isso não é uma expectativa razoável, a menos que haja circunstâncias incomuns.
Mas é possível inserir o nome da pasta pai na frente de cada arquivo - algo como "fileName.ext" --> "parentFolderName_fileName.ext"
O comando FOR /R
pode iterar os caminhos de pastas de todas as pastas dentro de uma árvore raiz.
O comando DIR /B /A-D "folderPath"
pode listar todos os arquivos dentro de uma pasta. Mas você não quer renomear arquivos que já começam com o nome da pasta pai, para que possam ser canalizados para FINDSTR para excluir os arquivos já renomeados.
Os resultados do comando canalizado podem ser iterados com FOR / F. As opções EOL e DELIMS são usadas para garantir que o nome completo de todos os arquivos seja preservado.
O %%~nxD
retorna apenas o nome da pasta e a extensão da pasta pai.
Juntando tudo, o seguinte liner longo pode ser usado diretamente na linha de comando. Ele processará a árvore com raiz no diretório atual.
for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /b /a-d "%D" 2^>nul^|findstr /vbic:"%~nxD_"') do ren "%D\%F" "%~nxD_%F"
O comando pode ser colocado em um script e, em seguida, a pasta raiz a ser processada pode ser passada como um argumento. Se nenhum argumento for fornecido, o script processará a partir do diretório atual. Se um argumento é dado, então esse valor é usado como a pasta raiz.
@for /r %1 %%D in (.) do @for /f "eol=: delims=" %%F in (
'dir /b /a-d "%%D" 2^>nul^|findstr /vbic:"%%~nxD_"'
) do ren "%%D\%%F" "%%~nxD_%%F"
O código é mais simples se você usar meu utilitário de renomeação de expressão regular JREN.BAT . É um script puro (lote / JScript híbrido) que é executado nativamente em qualquer máquina Windows do XP em diante. Nenhum arquivo exe de terceiros é necessário.
A documentação completa está incorporada no utilitário - acessado via jren /?
, ou jren /??
se você quiser saída paginada.
O seguinte comando simples processará a árvore com raiz no diretório atual:
for /r %F in (.) do @call jren "^" "%~nxF_" /p "%F" /fx "%~nxF_*"
Os dois primeiros argumentos JREN são as strings find / replace - A pesquisa corresponde ao início do nome do arquivo e a substituição simplesmente insere o nome da pasta pai (com um sublinhado final). A opção /P "%F"
especifica a pasta raiz. E a opção /FX "%~nxF_*
exclui os arquivos que já começam com o nome da pasta pai, seguidos por um sublinhado.
O comando pode ser colocado em um script em lote que aceita uma pasta raiz opcional como um argumento (process current directory se nenhum valor for dado):
@echo off
for /r %1 %%F in (.) do call jren "^" "%%~nxF_" /p "%%F" /fx "%%~nxF_*"