Есть ли способ пакетного переименования файлов в строчные?
Мне нужен способ переименовать все файлы в папках и подпапках в нижний регистр.
Я хотел бы знать, есть ли способ сделать это с помощью окон only (XP или 7).
Мне нужен способ переименовать все файлы в папках и подпапках в нижний регистр.
Я хотел бы знать, есть ли способ сделать это с помощью окон only (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
- (параметр для dir) Do not list directories. (a
- attribute
, -
- not
и d
- directory
). rename "%f" "%f"
- переименуйте файл со своим именем, которое на самом деле прописывается в нижнем регистре командой dir
и комбинацией /l
.spacetornado Renamer это программа для Windows, которая переименовывает массовое количество файлов партиями. Вы можете искать и заменять текст, удалять определенное количество символов, менять регистр на нижний, верхний или заглавный, а также добавлять текст в начало или конец (append/prepend) каждого имени файла
Начиная с 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
Моей личной любимой утилитой пакетного переименования файлов является 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
).
Лучшей программой для этого в Windows является Bulk Rename Utility . Это инструмент mans. Вы даже можете использовать regex для переименования файлов и/или папок. Она также имеет интеграцию с оболочкой (так что вы можете выполнить ее из проводника нажатием правой кнопки мыши), что очень мило. Доступны 64-битные и 32-битные версии.
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
Принятый ответ на этот вопрос, по loftysnake , работает для текущей директории, но не осуществляет поиск в подкаталогах.   Sawny предложил простую модификацию ответа loftysnake , чтобы сделать его рекурсивным, но это не работает, потому что, в то время как команда rename
позволяет указать диск и путь с именем файла1 (источник), имя файла2 (назначение) должно быть просто именем файла. Чтобы процитировать сообщение справки (/?
),
… вы не можете указать новый диск или путь к вашему целевому файлу.
Но move
работает там, где rename
нет, поэтому вы можете рекурсивно переименовывать файлы в нижний регистр с помощью этой команды:
for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (move /y "%f" "%f")
, потому что получается, что Move
может справиться с путями к каталогу.
Вышеприведенная команда работает при вводе непосредственно в командную строку (CMD.EXE
). если вы хотите сделать это из пакетного (.BAT
) файла, вы должны удвоить символы %
:
for /f "Tokens=*" %%f in ('dir /l/b/a-d/s') do (move /y "%%f" "%%f")
И вы, вероятно, можете оставить за скобками /y
и сказать только do move …
.
Powershell
Перейдите к грязи и бегите:
dir | Rename-Item -NewName { $_.Name.ToLowerInvariant() }
Я проверил, что это работает. Найдено здесь: http://www.hanselman.com/blog/PennyPinchingVideoMovingMyWebsitesImagesToTheAzureCDNAndUsingACustomDomain.aspx