@lazix

Как переименовать все файлы в нижний регистр с помощью cmd?

Сабж, осложняется древним багом Windows, не позволяющим изменить только лишь регистр имени файла, без изменения самого имени.
Условный
for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

поэтому не срабатывает. Вручную приходится делать Abc.jpg -> 1Abc.jpg -> abc.jpg
  • Вопрос задан
  • 861 просмотр
Решения вопроса 1
wisgest
@wisgest
Не ИТ-специалист
Уточнение про NTFS и FAT32 (добавлено 2022-12-26)
Условный
for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

поэтому не срабатывает.

Если бы это совсем не срабатывало, то вряд ли было бы выбрано лучшим ответом на соответствующий вопрос на Super User. У меня это срабатывает на NTFS, а вот на FAT32 (проверялось на съёмном USB-накопителе) — нет. Более того, на FAT32, если имя файла укладывается в формат 8.3, при попытке переименования (не обязательно с помощью CMD.EXE, можно и в Проводнике…), меняющем только регистр символов, все символы переводятся в верхний регистр!

Вручную приходится делать Abc.jpg -> 1Abc.jpg -> abc.jpg

Так что мешает делать это не вручную?
Например, в теле цикла
(ren "%f" "to_lower_%f" && ren "to_lower_%f" "%f")
При этом, правда, будут впустую переименовываться туда-сюда файлы с именами уже в нижнем регистре. Чтобы этого избежать можно добавить перед телом цикла проверку for %g in ("%~nxf") do if not "%f"==%g:
for /f "delims=" %f in ('dir /l/b/a-d') do  for %g in ("%~nxf") do  if not "%f"==%g  (ren "%f" "to_lower_%f" && ren "to_lower_%f" "%f")

Прежний совет (до правки 2022-12-25)
…Чтобы этого избежать можно сделать в командном файле так:
for /f "delims=" %%f in ('dir /l/b/a-d') do  for %%g in ("%%f*") do (
	if /i "%%f"=="%%g"  if not "%%f"=="%%g" (
		ren "%%f" "to_lower_%%f" && ren "to_lower_%%f" "%%f"
	)
)

И ещё: если обрабатываемая папка открыта в Проводнике, то, скорее всего (наблюдалось в случае NTFS), чтобы увидеть изменение регистра имён файлов, надо будет обновить содержимое окна.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
осложняется древним багом Windows

Это не баг. Это фича. В WinAPI имена файлов регистронезависимые. Поэтому и нельзя переименовать, т.к. с точки зрения WinAPI это одно и то же имя.

Вместо переименования с добавлением левого рандомного символа, предлагаю переносить в %TEMP% с одновременным изменением имени файла. Затем переносить обратно. Возможно переносить надо не в TEMP, а в другой каталог. Нужно что бы каталоги были на одном диске, чтоб не было реального копирования файлов. Может быть создавать тут же пустой временный каталог, так вы сможете гарантировать, что во временном каталоге не будет файлов с таким же именем.
Ответ написан
Комментировать
@kisaa
Обязательно cmd, Powershell не пойдет?
https://stackoverflow.com/questions/3822745/rename...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы