Windows CMD - Como renomear todos os arquivos em todas as subpastas para o nome da pasta pai

0

Tudo bem, roteiristas,

Ainda estou tentando enrolar minha cabeça em torno do comando FOR. O que eu gostaria de fazer é renomear todos os arquivos em todas as subpastas para o nome da pasta em que residem, mantendo suas extensões. Eu imagino que isso poderia ser feito com algo como:

   For /R %X in (*.*) do REN %X <argument for parent folder name>

Talvez eu esteja errado. Qual é a maneira correta de fazer isso? E deve ser um script. Não estou perguntando sobre Bulk Rename Utility ou File Renamer Deluxe, etc.

Obrigado pelo seu tempo!

    
por Heatseeker86 24.07.2016 / 09:24

2 respostas

1

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_*"
    
por 24.07.2016 / 17:05
0

Salvar como *.bat

@echo off
for /r %%D in (.) do (
  for /f "delims=" %%F in ('dir /b /A:-D "%%D"') do echo "%%D\%%F" "%%~nxD%%~xF"
)
@echo off
for /r %%F in (*) do (
  for /f "delims=" %%D in ("%%~dpF.") do echo "%%F" "%%~nxD%%~xF"
)

Verifique se é isso que você deseja antes de substituir echo por ren .

Referências:
Para - Comandos Looping
Extensões de parâmetro

    
por 24.07.2016 / 13:00