Чи є спосіб пакетного перейменування файлів у малі регістри?


63

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

Мені хотілося б знати, чи є спосіб зробити це лише за допомогою Windows (XP або 7)


windows не розрізняє малі та верхні шапки, як це робить Unix. можливо, якщо ви сказали, навіщо вам це потрібно, це допомогло б вирішити проблему.
Корінь

1
@Idigas. Вибачте, але, оскільки NTFS, імена файлів залежать від регістру. Дивіться сторінку support.microsoft.com/kb/100625
DaveParillo

Просто здорово. Візьміть погану ідею і поширюйте її далі. Який кошмар підтримки, коли хтось надсилає файл і помилка жирного пальця, означає, що вони надіслали "Answers.dat", а процес, що надходить, очікує "відповіді.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комбінації.

7
Рекурсивна версія: for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")(додано / r до режиму).
Sawny

3
це просто геніально
Shir Gans

4
Рекурсивна версія не працювала для мене - перейменування скаржилося на те, що команда знаходиться у недійсному форматі. Виявляється, / s спричинив список другого файлу як абсолютний шлях, і розширення імені файлу (% ~ nxf) дало мені оригінальне, велике ім'я файлу. Закінчилося просто вручну повторюючись.
Догматизований

3
Це дуже приємна відповідь; По суті, не потрібні зовнішні програми, хороша та маленька команда, не потрібен пакетний файл-складність.
Джефф Вілберт

2
Чи можна його змінити, щоб змінити малі літери на великі?
Чакі

18

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

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


1
Будь ласка, дайте мені причину відмови?
Джо

5
Люди рідко пояснюють, на жаль: /
Gnoupi

7
Я думаю, що голосування було в тому, що ОП хотіла рішення, яке працювало без додаткового програмного забезпечення. І я здогадуюсь, що голос не пояснили, тому що деякі люди схильні розправлятися з реваншами.
innaM

GUI є трохи funky, але він робить роботу краще, ніж кілька інших renamer, які я бачив там.
jcollum

1
Він робив те, що робив, коли мені потрібно було рекурсивне перейменування для очищення файлів з Linux FTP-сервера ... однак, потрібно було запустити його як адміністратор, перш ніж він працював належним чином. Відчуває себе старою непідтримуваною програмою :)
Нельсон

12

З Windows 7 ви можете використовувати PowerShell для цих завдань

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

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


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 / пакетний), який працює на будь-якій машині Windows від XP далі - не потрібні сторонні файли EXE. Повна документація вбудовується - доступ до неї здійснюється з командного рядка за допомогою jren /?або, jren /??якщо ви хочете, щоб вийти на сторінку.

З JREN рекурсивне рішення настільки ж просто, як:

jren "^" "" /s /l

1
Чудово працює. FYI зніміть /a-dперемикач, і він також зменшить малі імена папок.
Кіт

Спробував зберегти його як пакетний файл і вискакував у system32, щоб я міг запускати його будь-коли за допомогою однієї команди. Результати в цьому: " D"') was unexpected at this time.Запуск його як прямої команди працює добре, просто не працює, коли запускається як пакетний файл. Не впевнений у тому, як змусити його працювати як пакетний файл, але я подумав, що я б вирішив цю проблему.
Дон Каллен

1
@DonCullen - це стандартний синтаксис, що змінний відсоток FOR повинен бути подвоєний при використанні FOR в пакетному сценарії. Таким чином , %Dповинні змінитися , щоб %%Dі %Fв %%Fякщо помістити команду в пакетному сценарії.
dbenham

Завжди вчиться чомусь новому. Дякую!
Дон Каллен

6

Моя особиста улюблена утиліта для перейменування пакетних файлів - WildRename Cylog . Серед багатьох інших функцій він може змінити регістр імен файлів. Найкраще в WildRename - це, мабуть, те, що він підтримує регулярні вирази!


Це правильний додаток, після встановлення за 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комутатором).


Чому у вас cmd /c "echo %cd%& в першому for? Це зовсім непотрібно.
DavidPostill

@DavidPostill echo %cd%є для додавання поточної папки до списку абсолютних шляхів ; і cmd /cробить &роботу над комбінуванням команд. Я загальний нобіл щодо пакетного сценарію Windows ; якщо ви знаєте кращий спосіб, сміливо вдосконалюйте відповідь!
wc.matteo

Відмінна робота для ноб. Ваше було першим власним рішенням командного рядка cmd.exe, яке фактично працює, за винятком випадків, коли воно не вдається, коли ім’я починається з пробілу чи крапки з комою. Прийнята відповідь зазнає тієї ж проблеми. Дивіться мою відповідь для більш простої відповіді, яка також працює з пробілом або крапкою з комою.
dbenham

Чи можна це змінити, щоб перетворити нижчі на кришки?
Рішав

3

Ви можете використовувати стратегію "заміни символів" ...

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

... і так далі, для листів AZ. Можливо, ви могли його реалізувати у вигляді циклу FOR.


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-бітні версії.


1

Прийнята відповідь на це запитання, виконана loftysnake , працює для поточної директорії, але не шукає підпапки.  Соні запропонував просту модифікацію відповіді loftysnake, щоб зробити її рекурсивною, але вона не працює, тому що, хоча renameкоманда дозволяє вказати диск і шлях з ім'ям файлу1 (джерело), ​​ім'я файлу2 (призначення) має бути лише іменем файлу . Щоб цитувати повідомлення help ( /?),

... ви не можете вказати новий диск або шлях для вашого цільового файлу.

Але 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
)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.