Есть ли способ пакетного переименования файлов в нижний регистр?

121164
ino

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

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

59
Windows не различает маленькие и верхние заглавные буквы, как это делает Unix. возможно, если бы вы сказали, зачем вам это нужно, это помогло бы решить проблему. Rook 14 лет назад 0
@ Idigas. Извините, но начиная с NTFS, имена файлов чувствительны к регистру. См. Http://support.microsoft.com/kb/100625 DaveParillo 14 лет назад 1
Just great. Take a bad idea and spread it further. What a support nightmare when someone sends a file and a fat finger mistake means they sent "Answers.dat" and the incoming process expects "answers.dat". There's just no good reason for those two names to be considered 'different'. David 14 лет назад 0
@David, например, Java фактически требует имен файлов с учетом регистра. Это может привести к большим проблемам в не чувствительных к регистру файловых системах. Arjan 14 лет назад 2
Я знаю, что это старо, но я хотел уточнить здесь неправильное представление. Хотя NTFS поддерживает чувствительность к регистру, ОС Windows НЕ различает! geo 11 лет назад 9
Одна из упомянутых причин - кроссплатформенные инструменты, такие как Java. Например, если вы загружаете PDF-файлы с веб-сервера Apache в Windows, вам необходимо учитывать случай имени файла на диске. Alan B 8 лет назад 0

13 ответов на вопрос

114
loftysnake

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

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 в ('dir / l / b / ad / s') do (переименовать"% f "в"% f ")` (добавлено / r в dir). Sawny 11 лет назад 7
это просто блестящий Shir Gans 11 лет назад 3
Рекурсивная версия у меня не сработала - переименовал, пожаловался на недопустимый формат команды. Оказывается, / s заставил второй файл быть перечисленным как абсолютный путь, и использование расширения имени файла (% ~ nxf) дало мне оригинальное, прописное имя файла. Закончилось только ручным повторением. Dogmatixed 10 лет назад 4
Это очень хороший ответ; к слову, никаких внешних программ не требуется, хорошая и маленькая команда, не требуется сложность командного файла. Jeff Wilbert 10 лет назад 3
Можно ли изменить его, чтобы изменить строчные буквы на прописные? Chucky 8 лет назад 2
Это не удастся, если имя файла начинается с пробела или точки с запятой. Лучше использовать `" eol =: delims = "` dbenham 7 лет назад 0
Мне пришлось изменить `% f` на` %% f`; тогда это работало просто отлично. gilu 6 лет назад 1
Для рекурсии я должен был сделать следующее, чтобы заставить его работать. У меня такая же проблема, как у @Dogmatixed. `for / f" Tokens = * "do g ((dir / b ') do) (for / f" Tokens = * "% f in (' dir% ~ fg / l / b / a-d ') do ( переименовать "% ~ fg \% f" "% f")) ` halexh 6 лет назад 1
И как я могу изменить этот код, чтобы изменить от верхнего регистра до нижнего? Rishav 6 лет назад 0
Это не сработало для меня. Фактически, `переименовать FILE.EXT file.ext` не работает. Seppo Enarvi 6 лет назад 0
18
joe

spacetornado Renamer is a Windows program that renames mass amounts of files in batches. You can search and replace text, remove a certain number of characters, change the case to lower, upper or First Letter Capital, and add text to the beginning or end (append/prepend) of every filename

enter image description here

Пожалуйста, дайте мне причину для отрицательного голосования? joe 14 лет назад 1
Люди редко объясняют, к сожалению: / Gnoupi 14 лет назад 4
Я предполагаю, что отрицательное влияние было связано с тем, что ОП требовалось решение, которое работало без какого-либо дополнительного программного обеспечения. И я предполагаю, что отрицательное голосование не было объяснено, потому что некоторые люди склонны сдавать отрицательные голоса мести. innaM 14 лет назад 6
Графический интерфейс немного прикольный, но он делает работу лучше, чем несколько других переименователей, которые я там видел. jcollum 13 лет назад 0
Я только что проголосовал за тебя, чтобы отменить голосование. Возьми, даунвотер! Alan B 8 лет назад 0
Он сделал то, что сделал, когда мне нужно было рекурсивное переименование для очистки файлов с FTP-сервера Linux ... однако мне нужно было запустить его от имени администратора, чтобы он работал должным образом. По ощущениям старая необслуживаемая программа :) Nelson 8 лет назад 1
11
nixda

Since Windows 7 you could use PowerShell for those tasks

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

- Choose your root folder
- all files inside root folder and subfolders are renamed
- folder names are excluded with Where {-Not $_.PSIsContainer} |

6
dbenham

Вот правильное рекурсивное решение командной строки, использующее только собственные команды 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 
Работает отлично. К вашему сведению, удалите переключатель `/ ad`, и он также будет также содержать имена папок в нижнем регистре. Keith 6 лет назад 1
Попытался сохранить его как командный файл и вытолкнул его в system32, чтобы я мог запустить его в любое время с помощью одной команды. Результат в этом: `" D "') был неожиданным в это время. Запуск его как прямой команды работает нормально, просто не работает при запуске в виде командного файла. Не уверен, как заставить его работать как пакетный файл, но подумал, что я решу проблему. Don Cullen 6 лет назад 0
@DonCullen - это стандартный синтаксис, что процент переменной FOR должен быть удвоен при использовании FOR в пакетном скрипте. Поэтому `% D` должен измениться на` %% D`, а `% F` на` %% F`, если вы поместите команду в пакетный скрипт. dbenham 6 лет назад 1
Всегда узнавать что-то новое каждый день. Спасибо! Don Cullen 6 лет назад 0
5
Synetech

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

5
wc.matteo

"Recursive" version of the accepted answer (that works*)

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


The first loop

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

Gets a list of the absolute paths of all the directories inside the current (including it):

C:\Foo>

  • C:\Foo\TO.txt

  • C:\Foo\Bar\LOWER.txt

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


The second loop

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

Gets a list of all the file names (or file and directory names if you take out the /a-d switch) inside each of the absolute paths found by the first loop, and converts the name of these files to lowercase.

  • C:\Foo\TO.txt

  • C:\Foo\Bar\LOWER.txt

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


* it needs two loops because the second argument to rename must be a file name and not an absolute path (as the one obtained by the /s switch).

Почему у вас `cmd / c" echo% cd% & `в первом` for`? Это совершенно не нужно. DavidPostill 7 лет назад 0
@DavidPostill `echo% cd%` предназначен для добавления текущей папки в список _absolute paths_; и `cmd / c` заставляет` & `работать для объединения команд. Я абсолютный нуб в отношении _Windows Batch Scripting_; Если вы знаете лучший способ, не стесняйтесь улучшить ответ! wc.matteo 7 лет назад 0
Отличная работа для нуба. Это было ваше первое собственное решение командной строки cmd.exe, которое действительно работает, за исключением того, что оно терпит неудачу, когда имя начинается с пробела или точки с запятой. Принятый ответ страдает той же проблемой. См. [Мой ответ] (http://superuser.com/a/1103766/109090) для более простого ответа, который также работает с начальным пробелом или точкой с запятой. dbenham 7 лет назад 0
Может ли это быть изменено, чтобы конвертировать ниже в заглавные буквы? Rishav 6 лет назад 0
3
DednDave

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

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

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

1
Kevin Haines

http://www.dostips.com/DtCodeCmdLib.php#Function.toLower gives a simple function that you should be able to include and call from a batch file.

So have the batch file iterate over the folders/filenames, and call this function to generate the lowercase version of the name.

1
Even Mien

С 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 
1
ubiquibacon

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