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

63

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

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

я не
источник
Windows не различает маленькие и верхние заглавные буквы, как это делает Unix. возможно, если бы вы сказали, зачем вам это нужно, это помогло бы решить проблему.
Ладья
1
@ Idigas. Извините, но начиная с NTFS, имена файлов чувствительны к регистру. См support.microsoft.com/kb/100625
DaveParillo
Просто прекрасно. Возьмите плохую идею и распространите ее дальше. Какой ночной кошмар поддержки, когда кто-то отправляет файл, и ошибка с большим пальцем означает, что он отправил «answers.dat», и входящий процесс ожидает «answers.dat». У этих двух имен просто нет веских причин считать их «разными».
Дэвид
2
@David, например, Java фактически требует имен файлов с учетом регистра. Это может привести к большим проблемам в не чувствительных к регистру файловых системах.
Арьян
10
Я знаю, что это старо, но я хотел уточнить здесь неправильное представление. Хотя NTFS поддерживает чувствительность к регистру, ОС Windows НЕ различает!
Гео

Ответы:

122

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

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комбинации.
loftysnake
источник
7
Рекурсивная версия: for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")(добавлено / r в каталог).
Sawny
3
это просто великолепно
Шир Ганс
4
Рекурсивная версия у меня не сработала - переименовал, пожаловался на недопустимый формат команды. Оказывается, / s заставил второй файл быть перечисленным как абсолютный путь, и использование расширения имени файла (% ~ nxf) дало мне оригинальное, прописное имя файла. Закончилось только ручным повторением.
Dogmatixed
3
Это очень хороший ответ; к слову, никаких внешних программ не требуется, хорошая и маленькая команда, не требуется сложность командного файла.
Джефф Уилберт
2
Можно ли изменить его, чтобы изменить строчные буквы на прописные?
Чаки,
18

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

введите описание изображения здесь

Джо
источник
1
Пожалуйста, дайте мне причину отрицательного голосования?
Джо
5
Люди редко объясняют, к сожалению: /
Gnoupi
7
Я предполагаю, что отрицательное влияние было связано с тем, что ОП требовалось решение, которое работало без какого-либо дополнительного программного обеспечения. И я предполагаю, что отрицательный голос не был объяснен, потому что некоторые люди склонны сдавать отрицательные голоса мести.
InnaM
Графический интерфейс немного прикольный, но он делает работу лучше, чем несколько других переименователей, которые я там видел.
Jcollum
1
Он сделал то, что сделал, когда мне нужно было рекурсивное переименование для очистки файлов с FTP-сервера Linux ... однако, чтобы он работал должным образом, нужно было запустить его от имени администратора. Чувствуется как старая необслуживаемая программа :)
Нельсон
12

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

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

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

nixda
источник
7

Вот правильное рекурсивное решение командной строки, использующее только собственные команды 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
dbenham
источник
1
Работает отлично. К вашему сведению, удалите /a-dпереключатель, и он также будет содержать имена папок в нижнем регистре.
Кит
Попытался сохранить его как командный файл и вытолкнул его в system32, чтобы я мог запустить его в любое время с помощью одной команды. Результаты в следующем: " D"') was unexpected at this time.запуск его в качестве прямой команды работает нормально, просто не работает при запуске в виде командного файла. Не уверен, как заставить его работать как пакетный файл, но подумал, что я решу проблему.
Дон Каллен
1
@DonCullen - это стандартный синтаксис, что процент переменной FOR должен быть удвоен при использовании FOR в пакетном скрипте. Таким образом , %Dдолжны измениться , чтобы %%Dи %Fв %%Fесли поместить команду в пакетном сценарии.
dbenham
Всегда узнавать что-то новое каждый день. Спасибо!
Дон Каллен
6

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

Synetech
источник
Это правильное приложение, после установки в течение 10 секунд. Я настроил и рекурсивно переименовал удаленную папку (сопоставил для удобства).
Маттео Конта
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переключателем).

wc.matteo
источник
Почему у тебя cmd /c "echo %cd%& в первом for? Это совершенно не нужно.
DavidPostill
@DavidPostill echo %cd%добавит текущую папку в список абсолютных путей ; и cmd /cделает &работу по объединению команд. Я абсолютный новичок в отношении Windows Batch Scripting ; если вы знаете лучший способ, не стесняйтесь улучшить ответ!
wc.matteo
Отличная работа для новичка. Это было ваше первое собственное решение командной строки cmd.exe, которое действительно работает, за исключением того, что оно перестало работать, когда имя начинается с пробела или точки с запятой. Принятый ответ страдает той же проблемой. Смотрите мой ответ для более простого ответа, который также работает с начальным пробелом или точкой с запятой.
Дбенхем
Может ли это быть изменено, чтобы преобразовать нижнюю в верхний
Ришав
3

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

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

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

DednDave
источник
1

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

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

Кевин Хейнс
источник
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
Даже Миен
источник
1

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

ubiquibacon
источник
1

Принятый ответ на этот вопрос от 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, но я не могу найти это сейчас.
Скотт
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
)
Мик
источник