Existe uma maneira de renomear arquivos em lote para minúsculas?

62

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 não
fonte
o Windows não diferencia entre maiúsculas e minúsculas como o unix faz. talvez, se você disse, por que você precisa disso, ajudaria na solução do problema.
Rook
1
@Idigas. Desculpe, mas desde o NTFS, os nomes dos arquivos são sensíveis a maiúsculas e minúsculas. Veja support.microsoft.com/kb/100625
DaveParillo
Ótimo. Tome uma má ideia e espalhe-a ainda mais. Que pesadelo de apoio quando alguém envia um arquivo e um erro de dedo gordo significa que eles enviaram "Answers.dat" e o processo de entrada espera "respostas.dat". Simplesmente não há uma boa razão para esses dois nomes serem considerados "diferentes".
David David
2
@ David, por exemplo, o Java, na verdade, requer nomes de arquivo que diferenciam maiúsculas de minúsculas. Isso pode gerar muitos problemas em sistemas de arquivos que não diferenciam maiúsculas de minúsculas.
Arjan
10
Eu sei que isso é velho, mas eu queria esclarecer um equívoco aqui. Enquanto o NTFS suporta a diferenciação de maiúsculas e minúsculas, o sistema operacional Windows não diferencia!
Geo

Respostas:

119

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 . ( asignifica attribute, -significa note dsignifica directory) .
  • rename "%f" "%f"- renomeie o arquivo com seu próprio nome, que na verdade é minúsculo pelo dircomando e /lcombinação.
loftysnake
fonte
7
Versão recursiva: for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")(adicionado / r ao dir).
Sawny
3
isso é apenas briliant
Shir Gans
4
A versão recursiva não funcionou para mim - renomear reclamou sobre o comando estar em um formato inválido. Acontece que o / s fez com que o segundo arquivo fosse listado como um caminho absoluto e usar a expansão de nome de arquivo (% ~ nxf) me deu o nome de arquivo original em maiúsculas. Terminou apenas recursing manualmente.
Dogmatixed
3
Esta é uma resposta muito legal; ao ponto, nenhum programa externo precisou, comando agradável e pequeno, nenhum arquivo de lote complicou-ness necessário.
Jeff Wilbert
2
Pode ser modificado para mudar de minúsculas para maiúsculas?
Chucky
18

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

insira a descrição da imagem aqui

joe
fonte
1
Por favor, me dê a razão para votar?
joe
5
As pessoas raramente explicam, infelizmente:
Gnoupi
7
Eu acho que o downvote foi porque o OP queria uma solução que funcionasse sem qualquer software adicional. E eu acho que o voto não foi explicado porque algumas pessoas são propensas a lidar com votos negativos de vingança.
innaM
A GUI é um pouco funky, mas faz o trabalho melhor do que vários outros renamers que eu vi lá fora.
jcollum
1
Ele fez o que fez, quando eu precisei de renomeação recursiva para limpar arquivos de um servidor FTP do Linux ... no entanto, precisei executá-lo como Admin antes de funcionar corretamente. Parece um programa antigo e sem manutenção :)
Nelson
11

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} |

nixda
fonte
7

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
dbenham
fonte
1
Funciona bem. FYI remover o /a-dinterruptor e também irá diminuir os nomes das pastas também.
Keith
Tentei salvá-lo como um arquivo em lotes e estalei no system32 para que eu pudesse executá-lo a qualquer momento com um único comando. Resultados nisto: " 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.
Don Cullen
1
@DonCullen - É a sintaxe padrão para que as porcentagens variáveis ​​devam ser dobradas ao usar FOR dentro de um script em lote. Portanto, %Ddeve mudar para %%D, e %Fpara %%Fse você colocar o comando dentro de um script em lotes.
dbenham
Sempre aprendendo algo novo todos os dias. Obrigado!
Don Cullen
6

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!

Synetech
fonte
Este é o aplicativo certo, após a instalação em 10 segundos. Eu configurei e renomei recursivamente uma pasta remota (mapeada por conveniência).
Matteo Conta
5

Versão "recursiva" da resposta aceita (que funciona *)

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"))


O primeiro loop

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


O segundo loop

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-dcomutador) 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 renamedeve ser um nome de arquivo e não um caminho absoluto (como aquele obtido pelo /scomutador).

wc.matteo
fonte
Por que você tem cmd /c "echo %cd%& no primeiro for? É completamente desnecessário.
DavidPostill
@DavidPostill echo %cd%está lá para adicionar a pasta atual à lista de caminhos absolutos ; e cmd /cfaz 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!
wc.matteo
Excelente trabalho para um noob. A sua foi a primeira solução nativa de linha de comando cmd.exe que realmente funciona, exceto que falha quando um nome começa com espaço ou ponto-e-vírgula. A resposta aceita sofre o mesmo problema. Veja a minha resposta para uma resposta mais simples que também funciona com o espaço principal ou ponto e vírgula.
dbenham
Isso pode ser modificado para converter de baixo para caps?
Rishav
3

Você poderia usar uma estratégia de "substituição de personagem" ...

set Name=%Name:A=a%
set Name=%Name:B=b%
set Name=%Name:C=c%

... e assim por diante, para as letras AZ. Você provavelmente poderia implementá-lo na forma de um loop FOR.

DednDave
fonte
1

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.

Kevin Haines
fonte
1

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
Até Mien
fonte
1

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.

ubiquibacon
fonte
1

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 renamecomando 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 movefunciona onde renamenã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 Movepode 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 .BATarquivo 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 ….

Adrian
fonte
Se você vai re-postar informações que outras pessoas já postaram, você deve identificar o (s) autor (es) original (is) e linkar para o (s) seu (s) post (s).
Scott
Desculpe, mas eu estava apontando que movetrabalhou onde renamenão, e eu acho que sou o único que sugeriu o uso do movecomando aqui. Eu simplesmente peguei as sugestões de @loftysnake e @sawny, e esperançosamente as melhorei um pouquinho.
Adrian
Isso é estranho; Eu pensei que alguém tivesse mencionado move, mas não consigo encontrá-lo agora.
Scott
0

Solução recursiva. Coloque isso em um arquivo recursiverename.cmd ..

for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
for /r /d %%x in (*) do (
    pushd "%%x"
    for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
    popd
)
Mick
fonte