Мне нужен способ переименовать все файлы в папках и подпапках в нижний регистр.
Я хотел бы знать, если есть способ сделать это, используя только Windows (XP или 7)
Мне нужен способ переименовать все файлы в папках и подпапках в нижний регистр.
Я хотел бы знать, если есть способ сделать это, используя только Windows (XP или 7)
Ответы:
Перейдите в каталог и выполните следующую команду:
for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")
Вот разбивка на случай, если кто-то захочет изменить / улучшить:
for /f
- для каждой строки"Tokens=*"
- Обрабатывать каждый элемент в каждой строке.%f in (...)
- %f
это имя вашей переменной для каждого элемента.dir
- перечисляет каждый файл и подкаталог в каталоге./l
- (параметр для dir) Использует строчные буквы./b
- (параметр для dir) Используется пустой формат, только имена файлов / каталогов, без размера, без заголовков./a-d
- (параметр для директории) Вы не список каталогов . ( a
обозначает attribute
, -
обозначает not
и d
обозначает directory
) .rename "%f" "%f"
- переименуйте файл с его собственным именем, которое на самом деле в нижнем регистре dir
команды и /l
комбинации.for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")
(добавлено / r в каталог).
spacetornado Renamer - это программа для Windows, которая переименовывает большое количество файлов в пакетном режиме. Вы можете искать и заменять текст, удалять определенное количество символов, изменять регистр на нижний, верхний или заглавный, а также добавлять текст в начало или конец (добавление / добавление) каждого имени файла.
Начиная с Windows 7 вы можете использовать PowerShell для этих задач
Get-ChildItem "C:\path\to\folder" -recurse |
Where {-Not $_.PSIsContainer} |
Rename-Item -NewName {$_.FullName.ToLower()}
- Выберите корневую папку
- все файлы внутри корневой папки и подпапок переименованы
- имена папок исключаются с Where {-Not $_.PSIsContainer} |
Вот правильное рекурсивное решение командной строки, использующее только собственные команды cmd.exe, которые действительно работают. Я считаю, что это самое простое из возможных нативных решений:
for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"
Если вы хотите выйти за рамки собственных команд cmd.exe, то другой вариант - моя утилита переименования регулярных выражений JREN.BAT, которая поддерживает параметры для преобразования имен в верхний или нижний регистр. Это чистый скрипт (гибридный JScript / batch), который изначально запускается на любой машине с Windows начиная с XP - сторонних exe-файлов не требуется. Полная документация встроена - доступ из командной строки через jren /?
или, jren /??
если вы хотите, постраничный вывод.
С JREN рекурсивное решение так же просто, как:
jren "^" "" /s /l
/a-d
переключатель, и он также будет содержать имена папок в нижнем регистре.
" D"') was unexpected at this time.
запуск его в качестве прямой команды работает нормально, просто не работает при запуске в виде командного файла. Не уверен, как заставить его работать как пакетный файл, но подумал, что я решу проблему.
%D
должны измениться , чтобы %%D
и %F
в %%F
если поместить команду в пакетном сценарии.
Моя любимая утилита пакетного переименования файлов - Cylog's WildRename . Среди многих других функций, он может изменить регистр имен файлов. Самое лучшее в WildRename - это то, что он поддерживает регулярные выражения!
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"')
Получает список абсолютных путей всех каталогов внутри текущего (включая его):
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")
Получает список всех имен файлов (или имен файлов и каталогов, если вы /a-d
выключите переключатель) внутри каждого из абсолютных путей, найденных в первом цикле , и преобразует имя этих файлов в нижний регистр.
C: \ Foo \ TO.txt
C: \ Foo \ Bar \ LOWER.txt
C: \ Foo \ Bar \ Baz \ CASE.txt
* это требует двух циклов, потому что вторым аргументом rename
должно быть имя файла, а не абсолютный путь (как тот, который получен /s
переключателем).
cmd /c "echo %cd%&
в первом for
? Это совершенно не нужно.
echo %cd%
добавит текущую папку в список абсолютных путей ; и cmd /c
делает &
работу по объединению команд. Я абсолютный новичок в отношении Windows Batch Scripting ; если вы знаете лучший способ, не стесняйтесь улучшить ответ!
http://www.dostips.com/DtCodeCmdLib.php#Function.toLower предоставляет простую функцию, которую вы сможете включать и вызывать из командного файла.
Поэтому пусть пакетный файл перебирает папки / имена файлов и вызывает эту функцию для генерации строчной версии имени.
С http://windowsitpro.com/articles/index.cfm?articleid=81612 :
Используя только стандартные команды, я написал сценарии LwrCase.bat и LwrCase_Folder.bat, чтобы переименовать имя файла в нижний регистр или переименовать все имена файлов в папке в нижний регистр.
Чтобы переименовать имя файла в нижний регистр, используйте:
[call] LwrCase FullyQualifiedFileName
Где FullyQualifiedFileName - полное имя файла для переименования.
Чтобы переименовать все имена файлов в каталоге, используйте:
[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]
где FullyQualifiedDirectoryName - полный путь к папке, а / S - необязательный параметр, который также будет переименовывать имена файлов во всех подпапках.
ПРИМЕЧАНИЕ. LwrCase.bat использует параметр / L команды DIR, который возвращает имена в нижнем регистре.
LwrCase.bat содержит:
@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 содержит:
@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
Лучшая программа для этого в Windows - это Bulk Rename Utility . Это мужской инструмент. Вы даже можете использовать регулярные выражения для переименования файлов и / или папок. Он также имеет интеграцию с оболочкой (так что вы можете запустить его из проводника, щелкнув правой кнопкой мыши), что очень приятно. Доступны 64-битные и 32-битные версии.
Принятый ответ на этот вопрос от loftysnake работает для текущего каталога, но не ищет подпапки.
Sawny предложил простую модификацию ответа loftysnake,
чтобы сделать его рекурсивным, но он не работает, потому что, хотя rename
команда позволяет вам указать диск и путь с filename1 (источник), filename2 (место назначения) должно быть просто именем файла , Чтобы процитировать /?
сообщение помощи ( ),
… Вы не можете указать новый диск или путь к файлу назначения.
Но move
работает там, где rename
это не так, поэтому вы можете рекурсивно переименовывать файлы в нижний регистр с помощью этой команды:
for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (move /y "%f" "%f")
потому что получается, что Move
справляется с путями каталогов.
Приведенная выше команда работает при вводе непосредственно в командную строку ( CMD.EXE
). Если вы хотите сделать это из .BAT
файла batch ( ), вы должны удвоить %
символы:
for /f "Tokens=*" %%f in ('dir /l/b/a-d/s') do (move /y "%%f" "%%f")
И вы, вероятно, можете оставить скобки и /y
и просто сказать do move …
.
move
сработало там, где rename
нет, и я думаю, что я единственный, кто предложил использовать move
команду здесь. Я просто взял предложения @loftysnake и @sawny и, надеюсь, немного их улучшил.
move
, но я не могу найти это сейчас.
Powershell
Перейдите в каталог и запустите:
dir | Rename-Item -NewName { $_.Name.ToLowerInvariant() }
Я проверил, что это работает. Найдено здесь: http://www.hanselman.com/blog/PennyPinchingVideoMovingMyWebsitesImagesToTheAzureCDNAndUsingACustomDomain.aspx