Czy istnieje sposób, aby wsadowo zmienić nazwę plików na małe litery?


63

Potrzebuję sposobu na zmianę nazwy wszystkich plików w folderach i podfolderach na małe litery.

Chciałbym wiedzieć, czy można to zrobić tylko przy użyciu systemu Windows (XP lub 7)


Windows nie rozróżnia małych i górnych liter, tak jak Unix. może, jeśli powiesz, dlaczego jest to potrzebne, pomogłoby to rozwiązać problem.
Rook

1
@Idigas. Przepraszamy, ale od czasu NTFS w nazwach plików rozróżniana jest wielkość liter. Zobacz support.microsoft.com/kb/100625
DaveParillo

Po prostu świetnie. Podejmij zły pomysł i rozpowszechnij go dalej. Co za koszmar wsparcia, gdy ktoś wysyła plik, a błąd grubego palca oznacza, że ​​wysłał plik „Answers.dat”, a nadchodzący proces oczekuje „answer.dat”. Po prostu nie ma żadnego powodu, aby te dwa nazwiska były uważane za „różne”.
David

2
@David, na przykład Java rzeczywiście wymaga rozróżniania wielkości liter w nazwach plików. Może to powodować wiele problemów w systemach plików bez rozróżniania wielkości liter.
Arjan

10
Wiem, że to stare, ale chciałem tutaj wyjaśnić nieporozumienie. Podczas gdy NTFS obsługuje rozróżnianie wielkości liter, system operacyjny Windows NIE rozróżnia!
geo

Odpowiedzi:


122

Przejdź do katalogu i uruchom następujące polecenie:

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

Oto podział na wypadek, gdyby ktoś chciał zmodyfikować / ulepszyć:

  • for /f - Dla każdej linii
  • "Tokens=*" - Przetwarzaj każdy element w każdym wierszu.
  • %f in (...)- %fto twoja nazwa zmiennej dla każdego elementu.
  • dir - wyświetla listę wszystkich plików i podkatalogów w katalogu.
  • /l- (parametr dla katalogu) Używa małych liter.
  • /b- (parametr dla katalogu ) Używa czystego formatu, tylko nazwy plików / katalogów, bez rozmiaru, bez nagłówków.
  • /a-d- (parametr dla dir) Czy nie listy katalogów . ( aoznacza attribute, -oznacza noti doznacza directory) .
  • rename "%f" "%f"- zmień nazwę pliku na własną nazwę, która w rzeczywistości jest małymi literami dirpolecenia i /lkombinacji.

7
Wersja rekurencyjna: for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")(dodano / r do reż.)
Sawny

3
to jest po prostu genialne
Shir Gans

4
Wersja rekurencyjna nie działała dla mnie - zmiana nazwy narzekała na niepoprawny format polecenia. Okazało się, że / s spowodowało, że drugi plik został wymieniony jako ścieżka bezwzględna, a użycie rozszerzenia nazwy pliku (% ~ nxf) dało mi oryginalną nazwę pliku wielkimi literami. Skończyło się na ręcznym rekursowaniu.
Dogmatixed

3
To bardzo miła odpowiedź; do rzeczy, nie są potrzebne żadne programy zewnętrzne, ładne i małe polecenia, nie potrzeba skomplikowanego pliku wsadowego.
Jeff Wilbert

2
Czy można to zmienić, aby zmienić małe litery na wielkie?
Chucky,

18

spacetornado Renamer to program Windows, który zmienia nazwy masowych plików w partiach. Możesz wyszukiwać i zamieniać tekst, usuwać określoną liczbę znaków, zmieniać wielkość liter na małe, górne lub wielkie litery pierwszej litery, a także dodawać tekst na początku lub na końcu (dołączanie / dodawanie) każdej nazwy pliku

wprowadź opis zdjęcia tutaj


1
Proszę podać mi powód odrzucenia głosu?
Joe

5
Ludzie rzadko tłumaczą, niestety: /
Gnoupi

7
Wydaje mi się, że głosowanie było spowodowane tym, że OP chciał rozwiązania, które działałoby bez żadnego dodatkowego oprogramowania. I wydaje mi się, że głosowanie nie zostało wyjaśnione, ponieważ niektórzy ludzie mają skłonność do zemsty na głosowaniu.
innaM

GUI jest trochę funky, ale działa lepiej niż kilka innych nazw, które tam widziałem.
jcollum

1
Zrobił to, co zrobił, kiedy potrzebowałem rekurencyjnej zmiany nazwy do czyszczenia plików z serwera FTP Linux-a ... musiałem jednak uruchomić go jako Administrator, zanim zadziałał poprawnie. Czuje się jak stary, nieobsługiwany program :)
Nelson

12

Od Windows 7 możesz używać PowerShell do tych zadań

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

- Wybierz folder główny
- wszystkie pliki w folderze głównym i podfolderach są zmieniane
- nazwy folderów są wykluczone za pomocą Where {-Not $_.PSIsContainer} |


7

Oto właściwe rekurencyjne rozwiązanie wiersza polecenia, które używa tylko natywnych poleceń cmd.exe, które faktycznie działają. Uważam, że jest to najprostsze możliwe rozwiązanie natywne:

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

Jeśli chcesz wyjść poza natywne polecenia cmd.exe, inną opcją jest moje narzędzie do zmiany nazw wyrażeń regularnych JREN.BAT, które obsługuje opcje konwersji nazw na wielkie lub małe litery. Jest to czysty skrypt (hybrydowy JScript / partia), który działa natywnie na dowolnym komputerze z systemem Windows od XP - pliki exe innych firm nie są potrzebne. Pełna dokumentacja jest wbudowana - dostęp z wiersza poleceń za pośrednictwem jren /?lub, jren /??jeśli chcesz uzyskać wynik stronicowany.

W przypadku JREN rozwiązanie rekurencyjne jest tak proste, jak:

jren "^" "" /s /l

1
Działa świetnie. FYI usuń /a-dprzełącznik, a także zmniejszy małe litery w nazwach folderów.
Keith,

Próbowałem zapisać go jako plik wsadowy i wstawiłem do systemu32, aby móc go uruchomić w dowolnym momencie za pomocą jednego polecenia. Rezultaty: " D"') was unexpected at this time.Uruchomienie go jako polecenia bezpośredniego działa dobrze, po prostu nie działa, gdy jest uruchamiane jako plik wsadowy. Nie jestem pewien, jak sprawić, by działał jako plik wsadowy, ale pomyślałem, że podniosę sprawę.
Don Cullen,

1
@DonCullen - Jest to standardowa składnia, że ​​zmienne procenty FOR muszą zostać podwojone podczas korzystania z FOR w skrypcie wsadowym. Więc %Dmusi zmienić %%D, a %Fna %%Frazie można umieścić polecenia w skrypcie wsadowym.
dbenham

Zawsze uczę się czegoś nowego każdego dnia. Dzięki!
Don Cullen,

6

Moim ulubionym narzędziem do zmiany nazw plików wsadowych jest WildRename Cyloga . Wśród wielu innych funkcji może zmieniać wielkość liter. Najlepszą rzeczą w WildRename jest prawdopodobnie to, że obsługuje wyrażenia regularne!


To jest właściwa aplikacja, po instalacji w 10 sekund. Skonfigurowałem rekursywnie i zmieniłem nazwę folderu zdalnego (zmapowanego dla wygody).
Matteo Conta

5

„Rekurencyjna” wersja zaakceptowanej odpowiedzi (która działa *)

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


Pierwsza pętla

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

Pobiera listę ścieżek bezwzględnych wszystkich katalogów w bieżącym (w tym):

C: \ Foo>

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

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


Druga pętla

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

Pobiera listę wszystkich nazw plików (lub nazw plików i katalogów, jeśli wyjmiesz /a-dprzełącznik) w każdej z bezwzględnych ścieżek znalezionych w pierwszej pętli i konwertuje nazwy tych plików na małe litery.

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

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


* potrzebuje dwóch pętli, ponieważ drugim argumentem renamemusi być nazwa pliku, a nie ścieżka bezwzględna (taka jak uzyskana przez /sprzełącznik).


Dlaczego masz cmd /c "echo %cd%& w pierwszym for? Jest to całkowicie niepotrzebne.
DavidPostill

@DavidPostill echo %cd%jest tutaj, aby dodać bieżący folder do listy absolutnych ścieżek ; i cmd /csprawia, że &łączą polecenia. Jestem totalnym noobem w zakresie Windows Batch Scripting ; jeśli znasz lepszy sposób, popraw odpowiedź!
wc.matteo

Doskonała robota dla nooba. Twoje było pierwszym rodzimym rozwiązaniem wiersza polecenia cmd.exe, które faktycznie działa, z wyjątkiem tego, że zawodzi, gdy nazwa zaczyna się od spacji lub średnika. Przyjęta odpowiedź ma ten sam problem. Zobacz moją odpowiedź na prostszą odpowiedź, która działa również z wiodącą spacją lub średnikiem.
dbenham

Czy można to zmienić, aby zamienić dolne na wielkie?
Rishav

3

Możesz użyć strategii „zamiany postaci” ...

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

... i tak dalej, dla liter AZ. Prawdopodobnie można go zaimplementować w postaci pętli FOR.



1

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

Używając tylko standardowych poleceń, napisałem skrypt LwrCase.bat i LwrCase_Folder.bat, aby zmienić nazwę pliku na małe litery lub zmienić nazwy wszystkich nazw plików w folderze na małe litery.

Aby zmienić nazwę pliku na małe litery, użyj:

[call] LwrCase FullyQualifiedFileName

Gdzie FullyQualifiedFileName to w pełni kwalifikowana nazwa pliku, którego nazwę należy zmienić.

Aby zmienić nazwy wszystkich nazw plików w katalogu, użyj:

[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]

gdzie FullyQualifiedDirectoryName jest pełną ścieżką do folderu, a / S jest opcjonalnym parametrem, który zmieni także nazwy plików we wszystkich podfolderach.

UWAGA: LwrCase.bat korzysta z przełącznika / L polecenia DIR, który zwraca nazwy małych liter.

LwrCase.bat zawiera:

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

@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

Najlepszym programem do robienia tego w systemie Windows jest narzędzie Bulk Rename Utility . To narzędzie mężczyzny. Możesz nawet użyć wyrażenia regularnego, aby zmienić nazwę plików i / lub folderów. Ma również integrację z powłoką (dzięki czemu można uruchomić z Eksploratora jednym kliknięciem), co jest bardzo miłe. Dostępne wersje 64-bitowe i 32-bitowe.


1

Akceptowana odpowiedź na to pytanie autorstwa loftysnake działa dla bieżącego katalogu, ale nie przeszukuje podfolderów.  Sawny zasugerował prostą modyfikację odpowiedzi loftysnake, aby była rekurencyjna, ale nie działa, ponieważ chociaż renamepolecenie pozwala określić dysk i ścieżkę o nazwie nazwa_pliku1 (źródło), nazwa_pliku2 (miejsce docelowe) musi być tylko nazwą pliku . Aby zacytować komunikat pomocy ( /?),

… Nie możesz podać nowego dysku lub ścieżki do pliku docelowego.

Ale movedziała tam, gdzie renamenie działa, dzięki czemu możesz rekurencyjnie zmieniać nazwy plików na małe litery za pomocą tego polecenia:

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

bo okazuje się, że Moveporadzi sobie ze ścieżkami katalogów.

Powyższe polecenie działa, gdy zostanie wpisane bezpośrednio w wierszu polecenia ( CMD.EXE). Jeśli chcesz to zrobić z pliku batch ( .BAT), musisz podwoić %znaki:

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

I prawdopodobnie możesz zrezygnować z nawiasów i /y i powiedzieć sprawiedliwie do move ….


Jeśli zamierzasz ponownie opublikować informacje, które inni już opublikowali, powinieneś zidentyfikować oryginalnych autorów i link do ich postów.
Scott

Przepraszam, ale wskazałem, że movedziałało tam, gdzie renamenie działa i myślę, że tylko ja zasugerowałem użycie movepolecenia tutaj. Po prostu wziąłem sugestie @loftysnake i @sawny i mam nadzieję, że trochę je poprawiłem.
Adrian

To jest dziwne; Myślałem, że ktoś o tym wspomniał move, ale nie mogę go teraz znaleźć.
Scott

0

Rozwiązanie rekurencyjne. Umieść to w pliku 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
)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.