60

Мне нужен способ переименовать все файлы в папках и подпапках в нижний регистр.

Я хотел бы знать, если есть способ сделать это, используя только Windows (XP или 7)

13 ответов13

116

Перейдите в каталог и выполните следующую команду:

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 .
18

spacetornado Renamer - это программа для Windows, которая переименовывает большое количество файлов в пакетном режиме. Вы можете искать и заменять текст, удалять определенное количество символов, менять регистр на нижний, верхний или заглавный, а также добавлять текст в начало или конец (добавление / добавление) каждого имени файла

11

Начиная с Windows 7 вы можете использовать PowerShell для этих задач

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

- Выберите свою корневую папку
- все файлы внутри корневой папки и подпапок переименованы
- имена папок исключаются с помощью Where {-Not $_.PSIsContainer} |

6

Вот правильное рекурсивное решение командной строки, использующее только собственные команды 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
6

Моя личная любимая утилита пакетного переименования файлов - Cylog's WildRename. Среди многих других функций, он может изменить регистр имен файлов. Самое лучшее в WildRename - это то, что он поддерживает регулярные выражения!

5

"Рекурсивная" версия принятого ответа (работает *)

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

3

Вы можете использовать стратегию "замены персонажа" ...

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

... и так далее, для букв А-Я. Вы, вероятно, могли бы реализовать это в форме цикла FOR.

1

http://www.dostips.com/DtCodeCmdLib.php#Function.toLower предоставляет простую функцию, которую вы сможете включать и вызывать из командного файла.

Поэтому пусть пакетный файл перебирает папки / имена файлов и вызывает эту функцию для генерации строчной версии имени.

1

Лучшая программа для этого в Windows - это Bulk Rename Utility. Это мужской инструмент. Вы даже можете использовать регулярные выражения для переименования файлов и / или папок. Он также имеет интеграцию с оболочкой (так что вы можете запускать из проводника с правым кликом), что очень приятно. Доступны 64-битные и 32-битные версии.

1

Принятый ответ на этот вопрос от loftysnake работает для текущего каталога, но не ищет подпапки.  Сонни предложил простую модификацию ответа 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 …

1

С 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
0

Powershell

Перейдите в каталог и запустите:

dir | Rename-Item -NewName { $_.Name.ToLowerInvariant() }

Я проверил, что это работает. Найдено здесь: http://www.hanselman.com/blog/PennyPinchingVideoMovingMyWebsitesImagesToTheAzureCDNAndUsingACustomDomain.aspx

0

Рекурсивное решение. Поместите это в файл 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
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .