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)
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)
Odpowiedzi:
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 (...)
- %f
to 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 . ( a
oznacza attribute
, -
oznacza not
i d
oznacza directory
) .rename "%f" "%f"
- zmień nazwę pliku na własną nazwę, która w rzeczywistości jest małymi literami dir
polecenia i /l
kombinacji.for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")
(dodano / r do reż.)
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
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} |
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
/a-d
przełącznik, a także zmniejszy małe litery w nazwach folderów.
" 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ę.
%D
musi zmienić %%D
, a %F
na %%F
razie można umieścić polecenia w skrypcie wsadowym.
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!
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"')
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
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-d
przełą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 rename
musi być nazwa pliku, a nie ścieżka bezwzględna (taka jak uzyskana przez /s
przełącznik).
cmd /c "echo %cd%&
w pierwszym for
? Jest to całkowicie niepotrzebne.
echo %cd%
jest tutaj, aby dodać bieżący folder do listy absolutnych ścieżek ; i cmd /c
sprawia, że &
łączą polecenia. Jestem totalnym noobem w zakresie Windows Batch Scripting ; jeśli znasz lepszy sposób, popraw odpowiedź!
http://www.dostips.com/DtCodeCmdLib.php#Function.toLower zapewnia prostą funkcję, którą powinieneś być w stanie dołączyć i wywołać z pliku wsadowego.
Niech plik wsadowy przejdzie przez nazwy folderów / plików i wywołaj tę funkcję, aby wygenerować małą wersję nazwy.
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
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.
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ż rename
polecenie 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 move
działa tam, gdzie rename
nie 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 Move
poradzi 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 …
.
move
działało tam, gdzie rename
nie działa i myślę, że tylko ja zasugerowałem użycie move
polecenia tutaj. Po prostu wziąłem sugestie @loftysnake i @sawny i mam nadzieję, że trochę je poprawiłem.
move
, ale nie mogę go teraz znaleźć.
PowerShell
Przejdź do katalogu i uruchom:
dir | Rename-Item -NewName { $_.Name.ToLowerInvariant() }
Sprawdziłem, czy to działa. Znaleziono tutaj: http://www.hanselman.com/blog/PennyPinchingVideoMovingMyWebsitesImagesToTheAzureCDNAndUsingACustomDomain.aspx