Eu preciso de uma maneira de renomear todos os arquivos em pastas e subpastas para minúsculas.
Eu gostaria de saber se existe uma maneira de fazer isso usando apenas janelas (XP ou 7)
Eu preciso de uma maneira de renomear todos os arquivos em pastas e subpastas para minúsculas.
Eu gostaria de saber se existe uma maneira de fazer isso usando apenas janelas (XP ou 7)
Respostas:
Vá para o diretório e execute o seguinte comando:
for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")
Aqui está o detalhamento no caso de alguém querer modificar / melhorar:
for /f
- Para cada linha"Tokens=*"
- Processar cada item em todas as linhas.%f in (...)
- %f
é o nome da variável para cada item.dir
- lista todos os arquivos e subdiretórios em um diretório./l
- (parâmetro para dir) Usa minúsculas./b
- (parâmetro para dir) Usa o formato nu, apenas os nomes de arquivos / diretórios, sem tamanho, sem cabeçalhos./a-d
- (parâmetro para dir) Você não listar diretórios . ( a
significa attribute
, -
significa not
e d
significa directory
) .rename "%f" "%f"
- renomeie o arquivo com seu próprio nome, que na verdade é minúsculo pelo dir
comando e /l
combinação.for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")
(adicionado / r ao dir).
spacetornado Renamer é um programa do Windows que renomeia grandes quantidades de arquivos em lotes. Você pode pesquisar e substituir texto, remover um certo número de caracteres, alterar o caso para maiúscula, letra maiúscula ou maiúscula e adicionar texto ao início ou fim (acrescentar / preceder) de cada nome de arquivo
Desde o Windows 7, você poderia usar o PowerShell para essas tarefas
Get-ChildItem "C:\path\to\folder" -recurse |
Where {-Not $_.PSIsContainer} |
Rename-Item -NewName {$_.FullName.ToLower()}
- Escolha sua pasta raiz
- todos os arquivos dentro da pasta raiz e subpastas são renomeados
- os nomes das pastas são excluídos com Where {-Not $_.PSIsContainer} |
Aqui está uma solução de linha de comando recursiva adequada usando apenas comandos nativos do cmd.exe que realmente funcionam. Eu acredito que é a solução nativa mais simples possível:
for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"
Se você estiver disposto a ir além dos comandos nativos do cmd.exe, outra opção é o meu utilitário de renomeação de expressão regular JREN.BAT que suporta opções para converter nomes em letras maiúsculas ou minúsculas. É puro script (híbrido JScript / batch) que é executado nativamente em qualquer máquina Windows do XP em diante - sem necessidade de arquivos exe de terceiros. Documentação completa é construída - acessada a partir da linha de comando jren /?
, ou jren /??
se você deseja saída paginada.
Com o JREN, a solução recursiva é tão simples quanto:
jren "^" "" /s /l
/a-d
interruptor e também irá diminuir os nomes das pastas também.
" D"') was unexpected at this time.
Executá-lo como um comando direto funciona bem, simplesmente não funciona quando executado como um arquivo em lotes. Não tenho certeza de como fazer isso funcionar como um arquivo de lote, mas pensei em dar atenção ao problema.
%D
deve mudar para %%D
, e %F
para %%F
se você colocar o comando dentro de um script em lotes.
Meu utilitário favorito de renomeação de arquivos em lote é o WildRename da Cylog . Entre muitos outros recursos, ele pode alterar o caso de nomes de arquivos. A melhor coisa sobre o WildRename é provavelmente que ele suporta expressões regulares!
for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"') do (for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g"))
for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"')
Obtém uma lista dos caminhos absolutos de todos os diretórios dentro do atual (inclusive):
C: \ Foo>
C: \ Foo \ TO.txt
C: \ Foo \ Bar \ LOWER.txt
C: \ Foo \ Bar \ Baz \ CASE.txt
for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g")
Obtém uma lista de todos os nomes de arquivos (ou nomes de arquivos e diretórios, se você remover o /a-d
comutador) dentro de cada um dos caminhos absolutos encontrados pelo primeiro loop e converte o nome desses arquivos em minúsculas.
C: \ Foo \ TO.txt
C: \ Foo \ Bar \ LOWER.txt
C: \ Foo \ Bar \ Baz \ CASE.txt
* ele precisa de dois loops porque o segundo argumento rename
deve ser um nome de arquivo e não um caminho absoluto (como aquele obtido pelo /s
comutador).
cmd /c "echo %cd%&
no primeiro for
? É completamente desnecessário.
echo %cd%
está lá para adicionar a pasta atual à lista de caminhos absolutos ; e cmd /c
faz o &
trabalho para combinar comandos. Eu sou um noob total sobre o Windows Batch Scripting ; Se você souber de uma maneira melhor, fique à vontade para melhorar a resposta!
http://www.dostips.com/DtCodeCmdLib.php#Function.toLower fornece uma função simples que você deve poder incluir e chamar de um arquivo de lote.
Portanto, faça com que o arquivo em lote faça a iteração das pastas / nomes de arquivos e chame essa função para gerar a versão em letras minúsculas do nome.
De http://windowsitpro.com/articles/index.cfm?articleid=81612 :
Usando apenas comandos padrão, eu tenho scripts LwrCase.bat e LwrCase_Folder.bat, para renomear um nome de arquivo para minúsculas ou renomear todos os nomes de arquivo em uma pasta para minúsculas.
Para renomear um nome de arquivo para minúscula, use:
[call] LwrCase FullyQualifiedFileName
Onde FullyQualifiedFileName é o nome completo do arquivo a ser renomeado.
Para renomear todos os nomes de arquivos em um diretório, use:
[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]
onde FullyQualifiedDirectoryName é o caminho da pasta totalmente qualificada e / S é um parâmetro opcional que também renomeia nomes de arquivos em todas as subpastas.
Observação: LwrCase.bat usa a opção / L do comando DIR, que retorna nomes de minúsculas.
LwrCase.bat contém:
@echo off
if {%1}=={} @echo Syntax: LwrCase FullyQualifiedFileName&goto :EOF
if not exist %1 @echo LwrCase - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
set file=%%a
)
if /i "%file:~0,1%" EQU "d" @echo LwrCase - %1 is NOT a file.&endlocal&goto :EOF
for /f "Tokens=*" %%f in ('dir %1 /L /b /a /a-d') do (
Rename %1 "%%f"
)
endlocal
LwrCase_Folder.bat contém:
@echo off
if {%1}=={} @echo Syntax: LwrCase_Folder FullyQualifiedDirectoryName&goto :EOF
if not exist %1 @echo LwrCase_Folder - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
set folder=%%a
)
if /i "%folder:~0,1%" NEQ "d" @echo LwrCase_Folder - %1 is NOT a folder.&endlocal&goto :EOF
pushd %1
set sw=/B /A /A-D
if /i {%2}=={/S} set sw=%sw% %2
for /f "Tokens=*" %%f in ('dir %sw%') do (
call LwrCase "%%f"
)
popd
endlocal
O melhor programa para fazer isso no Windows é o Bulk Rename Utility . É uma ferramenta do homem. Você pode até usar o regex para renomear arquivos e / ou pastas. Ele também tem integração shell (assim você pode executar a partir do explorador com um clique direito), o que é muito bom. Versões de 64 bits e 32 bits disponíveis.
A resposta aceita para essa questão, por loftysnake , funciona para o diretório atual, mas não pesquisa subpastas.
Sawny sugeriu uma modificação simples na resposta de loftysnake
para torná-la recursiva, mas não funciona, porque, enquanto o rename
comando permite que você especifique uma unidade e um caminho com filename1 (a origem), filename2 (o destino) deve ser apenas um nome de arquivo . Para citar a /?
mensagem help ( ),
… Você não pode especificar uma nova unidade ou caminho para o seu arquivo de destino.
Mas move
funciona onde rename
não, para que você possa recursivamente renomear arquivos para minúsculas com este comando:
for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (move /y "%f" "%f")
porque acontece que Move
pode lidar com caminhos de diretório.
O comando acima funciona quando digitado diretamente no Prompt de Comando ( CMD.EXE
). Se você quiser fazer isso de dentro de um .BAT
arquivo batch ( ), você deve dobrar os %
caracteres:
for /f "Tokens=*" %%f in ('dir /l/b/a-d/s') do (move /y "%%f" "%%f")
E você provavelmente pode deixar os parênteses /y
e dizer apenas do move …
.
move
trabalhou onde rename
não, e eu acho que sou o único que sugeriu o uso do move
comando aqui. Eu simplesmente peguei as sugestões de @loftysnake e @sawny, e esperançosamente as melhorei um pouquinho.
move
, mas não consigo encontrá-lo agora.
Powershell
Navegue até o diretório e execute:
dir | Rename-Item -NewName { $_.Name.ToLowerInvariant() }
Eu verifiquei que isso funciona. Encontrado aqui: http://www.hanselman.com/blog/PennyPinchingVideoMovingMyWebsitesImagesToTheAzureCDNAndUsingACustomDomain.aspx