C'è un modo per rinominare in batch i file in minuscolo?
Ho bisogno di un modo per rinominare tutti i file nelle cartelle e sottocartelle in minuscolo.
Vorrei sapere se c'è un modo per farlo usando solo windows (XP o 7)
Ho bisogno di un modo per rinominare tutti i file nelle cartelle e sottocartelle in minuscolo.
Vorrei sapere se c'è un modo per farlo usando solo windows (XP o 7)
Andate nella directory ed eseguite il seguente comando:
for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")
Ecco la suddivisione nel caso qualcuno voglia modificare/migliorare:
for /f
- Per ogni linea "Tokens=*"
- Elaborare ogni elemento in ogni linea. %f in (...)
- %f
è il tuo nome di variabile per ogni elemento. dir
- elenca ogni file e sottodirectory in una directory. /l
- (parametro per dir) Usa le minuscole. /b
- (parametro per dir) Usa il formato nudo, solo i nomi di file/directory, nessuna dimensione, nessuna intestazione. /a-d
- (parametro per dir) Non non elenca le directory. (a
sta per attribute
, -
sta per not
e d
sta per directory
). rename "%f" "%f"
- rinominare il file con il proprio nome, che è in realtà minuscolo dalla combinazione del comando dir
e /l
.(http://www.spacetornado.com/Renamer/) è un programma per Windows che rinomina grandi quantità di file in batch. È possibile cercare e sostituire il testo, rimuovere un certo numero di caratteri, cambiare il caso in inferiore, superiore o Prima lettera maiuscola, e aggiungere testo all'inizio o alla fine (append/prepend) di ogni nome di file
Da Windows 7 potete usare PowerShell per questi compiti
Get-ChildItem "C:\path\to\folder" -recurse |
Where {-Not $_.PSIsContainer} |
Rename-Item -NewName {$_.FullName.ToLower()}
Where {-Not $_.PSIsContainer} |
Ecco una corretta soluzione a linea di comando ricorsiva usando solo comandi nativi cmd.exe che funziona davvero. Credo 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 sei disposto ad andare oltre i comandi nativi di cmd.exe, allora un'altra opzione è la mia JREN.BAT regular expression renaming utility che supporta opzioni per convertire i nomi in maiuscolo o minuscolo. È uno script puro (ibrido JScript/batch) che funziona nativamente su qualsiasi macchina Windows da XP in poi - nessun file exe di terze parti necessario. La documentazione completa è incorporata - accessibile dalla linea di comando tramite jren /?
, o jren /??
se volete un output impaginato.
Con JREN, la soluzione ricorsiva è semplice come:
jren "^" "" /s /l
La mia utility preferita per rinominare i file in batch è Cylog’s WildRename . Tra le molte altre caratteristiche, può cambiare il caso dei nomi dei file. La cosa migliore di WildRename è probabilmente che supporta le espressioni regolari!
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"')
Ottiene una lista dei percorsi assoluti di tutte le directory dentro la corrente (inclusa):
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")
Ottiene una lista di tutti i nomi dei file (o nomi di file e directory se si toglie lo switch /a-d
) dentro 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 cicli perché il secondo argomento di rename
deve essere un nome di file e non un percorso assoluto (come quello ottenuto dallo switch /s
).
Il miglior programma per fare questo in Windows è Bulk Rename Utility . È uno strumento manuale. Puoi anche usare regex per rinominare file e/o cartelle. Ha anche un'integrazione con la shell (in modo da poterla eseguire da explorer con un clic destro) che è molto bella. Sono disponibili versioni a 64 bit e 32 bit.
http://www.dostips.com/DtCodeCmdLib.php#Function.toLower dà una semplice funzione che dovresti essere in grado di includere e chiamare da un file batch.
Quindi fai in modo che il file batch iteri sulle cartelle/nomi di file e chiami questa funzione per generare la versione minuscola del nome.
Da http://windowsitpro.com/articles/index.cfm?articleid=81612 :
Usando solo comandi standard, ho scriptato LwrCase.bat e LwrCase\Folder.bat, per rinominare un nome di file in minuscolo, o rinominare tutti i nomi di file in una cartella in minuscolo.
Per rinominare un nome di file in minuscolo, usa:
[call] LwrCase FullyQualifiedFileName
dove FullyQualifiedFileName è il nome completo del file da rinominare.
Per rinominare tutti i nomi dei file in una directory, usa:
[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]
dove FullyQualifiedDirectoryName è il percorso della cartella completamente qualificato, e /S è un parametro opzionale che rinominerà anche i nomi dei file in tutte le sotto-cartelle.
NOTA: LwrCase.bat fa uso dello switch /L del comando DIR, che restituisce 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
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 comando rename
ti permette di specificare un'unità e un percorso con nomefile1 (la sorgente), nomefile2 (la destinazione) deve essere solo un nomefile. Per citare il messaggio di aiuto (/?
),
… non puoi specificare una nuova unità o percorso per il file di destinazione.
Ma move
funziona dove rename
non funziona, quindi puoi rinominare ricorsivamente 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 Move
può gestire i percorsi delle directory.
Il comando di cui sopra funziona quando viene digitato direttamente nel Prompt dei comandi (CMD.EXE
). Se vuoi fare questo da dentro un file batch (.BAT
), 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 e lo /y
e dire solo do move …
.
Powershell
Naviga nella cartella ed esegui:
dir | Rename-Item -NewName { $_.Name.ToLowerInvariant() }
Ho verificato che questo funziona. Trovato qui: http://www.hanselman.com/blog/PennyPinchingVideoMovingMyWebsitesImagesToTheAzureCDNAndUsingACustomDomain.aspx