C'è un modo per rinominare in batch i file in minuscolo?


63

Ho bisogno di un modo per rinominare tutti i file in cartelle e sottocartelle in minuscolo.

Vorrei sapere se esiste un modo per farlo utilizzando solo Windows (XP o 7)


windows non distingue tra maiuscole e minuscole come fa unix. forse, se hai detto, perché ne hai bisogno, aiuterebbe a risolvere il problema.
Rook

1
@ Idigas. Siamo spiacenti, ma da NTFS i nomi dei file sono stati sensibili al maiuscolo / minuscolo. Vedere support.microsoft.com/kb/100625
DaveParillo il

Semplicemente fantastico. Prendi una cattiva idea e diffondila ulteriormente. Che incubo di supporto quando qualcuno invia un file e un errore fat finger significa che hanno inviato "Answers.dat" e il processo in arrivo prevede "risposte.dat". Non c'è proprio una buona ragione per considerare quei due nomi "diversi".
David

2
@David, ad esempio Java in realtà richiede nomi di file con distinzione tra maiuscole e minuscole. Ciò può causare molti problemi sui file system senza distinzione tra maiuscole e minuscole.
Arjan,

10
So che questo è vecchio, ma volevo chiarire un malinteso qui. Mentre NTFS supporta la distinzione tra maiuscole e minuscole, il sistema operativo Windows NON differenzia!
geo

Risposte:


122

Vai alla directory ed esegui il seguente comando:

for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

Ecco la ripartizione nel caso in cui qualcuno voglia modificare / migliorare:

  • for /f - Per ogni riga
  • "Tokens=*" - Elabora ogni articolo in ogni riga.
  • %f in (...)- %fè il nome della tua variabile per ogni articolo.
  • dir - elenca tutti i file e le sottodirectory di una directory.
  • /l- (parametro per dir) Utilizza lettere minuscole.
  • /b- (parametro per dir) Utilizza il formato nudo, solo i nomi di file / directory, nessuna dimensione, nessuna intestazione.
  • /a-d- (parametro per dir) Do non elencare le directory . ( asta per attribute, -sta per note dsta per directory) .
  • rename "%f" "%f"- rinominare il file con il proprio nome, che in realtà è minuscolo in base al dircomando e alla /lcombinazione.

7
Versione ricorsiva: for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")(aggiunto / r alla directory).
Sawny,

3
questo è semplicemente geniale
Shir Gans

4
La versione ricorsiva non ha funzionato per me - la rinomina si è lamentata del fatto che il comando era in un formato non valido. Si scopre che / s ha fatto sì che il secondo file sia elencato come percorso assoluto e l'uso dell'espansione del nome file (% ~ nxf) mi ha dato il nome file originale maiuscolo. Finì solo ricorrendo manualmente.
Dogmatix

3
Questa è una risposta molto bella; al punto, non sono necessari programmi esterni, un comando piacevole e di piccole dimensioni, nessuna complicanza dei file batch necessaria.
Jeff Wilbert,

2
Può essere modificato per passare da lettere minuscole a maiuscole?
Chucky

18

spacetornado Renamer è un programma Windows che rinomina grandi quantità di file in batch. Puoi cercare e sostituire il testo, rimuovere un certo numero di caratteri, modificare il maiuscolo, il maiuscolo, il maiuscolo o il maiuscolo e aggiungere del testo all'inizio o alla fine (aggiungi / anteponi) di ogni nome file

inserisci qui la descrizione dell'immagine


1
Per favore, mi dia il motivo del voto contrario?
joe

5
Le persone raramente spiegano, purtroppo: /
Gnoupi

7
Immagino che il downvote sia stato perché l'OP voleva una soluzione che funzionasse senza alcun software aggiuntivo. E immagino che il downvote non sia stato spiegato perché alcune persone sono inclini a distribuire downvotes di vendetta.
innaM

La GUI è un po 'funky, ma fa il lavoro meglio di molti altri rinominatori che ho visto là fuori.
jcollum,

1
Ha fatto quello che aveva fatto, quando avevo bisogno di una ridenominazione ricorsiva per ripulire i file da un server FTP Linux ... tuttavia, era necessario eseguirlo come amministratore prima che funzionasse correttamente. Sembra un vecchio programma non mantenuto :)
Nelson,

12

Da Windows 7 è possibile utilizzare PowerShell per tali attività

Get-ChildItem "C:\path\to\folder" -recurse | 
  Where {-Not $_.PSIsContainer} | 
  Rename-Item -NewName {$_.FullName.ToLower()}

- Scegli la cartella principale
- tutti i file all'interno della cartella principale e delle sottocartelle vengono rinominati
- i nomi delle cartelle sono esclusi con Where {-Not $_.PSIsContainer} |


7

Ecco una corretta soluzione ricorsiva da riga di comando che utilizza solo comandi cmd.exe nativi che funzionano effettivamente. Credo che sia la soluzione nativa più semplice possibile:

for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"

Se si desidera andare oltre i comandi nativi di cmd.exe, un'altra opzione è l' utilità di ridenominazione delle espressioni regolari JREN.BAT che supporta le opzioni per convertire i nomi in maiuscolo o minuscolo. È puro script (ibrido JScript / batch) che viene eseguito in modo nativo su qualsiasi macchina Windows da XP in poi - non sono necessari file exe di terze parti. La documentazione completa è integrata, accessibile dalla riga di comando tramite jren /?o jren /??se si desidera un output di paginazione.

Con JREN, la soluzione ricorsiva è semplice come:

jren "^" "" /s /l

1
Funziona alla grande. Cordiali saluti, rimuovo l' /a-dinterruttore e minuscola anche i nomi delle cartelle.
Keith,

Ho provato a salvarlo come file batch e lo ho inserito in system32 in modo da poterlo eseguire in qualsiasi momento con un singolo comando. Risultati in questo: " D"') was unexpected at this time.eseguirlo come comando diretto funziona bene, semplicemente non funziona quando eseguito come file batch. Non sono sicuro di come farlo funzionare come file batch, ma ho pensato di dare un avvertimento al problema.
Don Cullen,

1
@DonCullen - È una sintassi standard che le percentuali variabili FOR devono essere raddoppiate quando si utilizza FOR all'interno di uno script batch. Quindi %Ddeve cambiare in %%D, e %Fin %%Fse si inserisce il comando all'interno di uno script batch.
dbenham,

Imparando sempre qualcosa di nuovo ogni giorno. Grazie!
Don Cullen,

6

La mia utility preferita per rinominare i file batch è WildRename di Cylog . Tra le molte altre funzionalità, può cambiare il caso dei nomi dei file. La cosa migliore di WildRename è probabilmente che supporta le espressioni regolari!


QUESTA è l'app giusta, dopo l'installazione in 10 secondi. Ho configurato e rinominato ricorsivamente una cartella remota (mappata per comodità).
Matteo Conta,

5

Versione "ricorsiva" della risposta accettata (che funziona *)

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


Il primo ciclo

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"')

Ottiene un elenco dei percorsi assoluti di tutte le directory all'interno dell'attuale (incluso):

C: \ Foo>

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

  • C: \ Foo \ Bar \ Baz \ CASE.txt


Il secondo ciclo

for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g")

Ottiene un elenco di tutti i nomi di file (o nomi di file e directory se si elimina lo /a-dswitch) all'interno di ciascuno dei percorsi assoluti trovati dal primo ciclo e converte il nome di questi file in minuscolo.

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

  • C: \ Foo \ Bar \ Baz \ CASE.txt


* ha bisogno di due loop perché il secondo argomento renamedeve essere un nome file e non un percorso assoluto (come quello ottenuto /sdall'opzione).


Perché hai cmd /c "echo %cd%& nel primo for? È completamente inutile.
DavidPostill

@DavidPostill echo %cd%è lì per aggiungere la cartella corrente all'elenco dei percorsi assoluti ; e cmd /cfa &lavorare per combinare i comandi. Sono un noob totale per quanto riguarda Windows Batch Scripting ; se conosci un modo migliore, sentiti libero di migliorare la risposta!
wc.matteo,

Ottimo lavoro per un noob. La tua è stata la prima soluzione nativa da riga di comando cmd.exe che in realtà funziona, tranne che non riesce quando un nome inizia con spazio o punto e virgola. La risposta accettata presenta lo stesso problema. Vedi la mia risposta per una risposta più semplice che funziona anche con spazio iniziale o punto e virgola.
dbenham,

Questo può essere modificato per convertire in maiuscolo?
Rishav,

3

Potresti usare una strategia di "sostituzione del personaggio" ...

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

... e così via, per le lettere AZ. Probabilmente potresti implementarlo sotto forma di un ciclo FOR.



1

Da http://windowsitpro.com/articles/index.cfm?articleid=81612 :

Utilizzando solo i comandi standard, ho scritto LwrCase.bat e LwrCase_Folder.bat con script, per rinominare un nome file in lettere minuscole o rinominare tutti i nomi file in una cartella in lettere minuscole.

Per rinominare un nome file in lettere minuscole, utilizzare:

[call] LwrCase FullyQualifiedFileName

Dove FullyQualifiedFileName è il nome file completo da rinominare.

Per rinominare tutti i nomi dei file in una directory, utilizzare:

[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]

dove FullyQualifiedDirectoryName è il percorso completo della cartella e / S è un parametro facoltativo che rinominerà anche i nomi dei file in tutte le sottocartelle.

NOTA: LwrCase.bat utilizza l'opzione / L del comando DIR, che restituisce i nomi in minuscolo.

LwrCase.bat contiene:

@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 contiene:

@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

1

Il miglior programma per farlo in Windows è Bulk Rename Utility . È uno strumento mans. Puoi anche usare regex per rinominare file e / o cartelle. Ha anche l'integrazione della shell (in modo da poter eseguire da Explorer con un clic destro) che è molto bello. Disponibili versioni a 64 e 32 bit.


1

La risposta accettata a questa domanda, da loftysnake , funziona per la directory corrente ma non cerca nelle sottocartelle.  Sawny ha suggerito una semplice modifica alla risposta di loftysnake per renderla ricorsiva, ma non funziona, perché, mentre il renamecomando consente di specificare un'unità e un percorso con nome file1 (l'origine), nome file2 (la destinazione) deve essere solo un nome file . Per citare il /?messaggio help ( ),

... non è possibile specificare una nuova unità o percorso per il file di destinazione.

Ma movefunziona dove renameno, quindi puoi rinominare in modo ricorsivo i file in minuscolo con questo comando:

for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (move /y "%f" "%f")

perché si scopre che Movepuò far fronte ai percorsi delle directory.

Il comando sopra funziona quando digitato direttamente nel Prompt dei comandi ( CMD.EXE). Se vuoi farlo da un .BATfile batch ( ), devi raddoppiare i %caratteri:

for /f "Tokens=*" %%f in ('dir /l/b/a-d/s') do (move /y "%%f" "%%f")

E probabilmente puoi lasciare le parentesi /y e dire solo do move ….


Se hai intenzione di postare di nuovo le informazioni che altri hanno già pubblicato, dovresti identificare gli autori originali e collegarti ai loro post.
Scott,

Ci dispiace, ma stavo sottolineando che ha movefunzionato dove renamenon funziona e penso di essere l'unico che ha suggerito l'uso del movecomando qui. Ho semplicemente preso i suggerimenti di @loftysnake e @sawny e, si spera, li ho migliorati un pochino.
Adrian,

Quello è strano; Pensavo che qualcun altro avesse menzionato move, ma non riesco a trovarlo ora.
Scott,

0

Soluzione ricorsiva. Metti questo in un file 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
)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.