Замена в имени файлов кириллицы на латиницу
Подскажите, как можно заменить русские буквы на латинские во всех файлах данной папки?
Я имею в виду похожие русские и латинские буквы, например: "а" (рус) на "a" латинскую и т.д.
Имена файлов различные, расширения тоже. Необходимо для последующей заливки на сервер,
а из-за кириллицы в именах файлов возникают проблемы...
|
VedunO, для этого вам понадобится создать вот такой вот скрипт и разместить его рядом с тем, откуда он будет вызываться, либо же добавить в path:
func_translit.cmd
Код:
@Echo Off
:: Inquisitor, 2013
SetLocal EnableDelayedExpansion
:: Первый аргумент служит в качестве входящих данных.
Set Data=%~1
:: Проверяем на то, передан ли аргумент и заменяем пробелы на нижнее
:: подчеркивание.
If Defined Data (Set Data=!Data: =_!) Else (Exit /B 1)
:: Посимвольная обработка и поиск соответствия символам кириллицы
:: в соответствии с таблицей транслитерации. Если символ не указан в
:: таблице - он остается неизменным.
Set Result=
:Translit
Set Char=!Data:~,1!
For /F "tokens=2 delims==" %%A In ('Find "::#%Char%=" "%~dpnx0"') Do (Set Char=%%A)
Set Result=!Result!!Char!
If Not "!Data:~1!"=="" (
Set Data=!Data:~1!
GoTo Translit
) Else (
Echo !Result!
)
Exit /B 0
:: Таблица транслитерации
::#a=a
::#б=b
::#в=v
::#г=g
::#д=d
::#е=e
::#ё=yo
::#ж=zh
::#з=z
::#и=i
::#й=i
::#к=k
::#л=l
::#м=m
::#н=n
::#о=o
::#п=p
::#р=r
::#с=s
::#т=t
::#у=u
::#ф=f
::#х=kh
::#ц=c
::#ч=ch
::#ш=sh
::#щ=sh
::#ъ=.
::#ы=y
::#ь=.
::#э=e
::#ю=yu
::#я=ya
::#А=A
::#Б=B
::#В=V
::#Г=G
::#Д=D
::#Е=E
::#Ё=Yo
::#Ж=Zh
::#З=Z
::#И=I
::#Й=I
::#К=K
::#Л=L
::#М=M
::#Н=N
::#О=O
::#П=P
::#Р=R
::#С=S
::#Т=T
::#У=U
::#Ф=F
::#Х=Kh
::#Ц=C
::#Ч=Ch
::#Ш=Sh
::#Щ=Sh
::#Ъ=.
::#Ы=Y
::#Ь=.
::#Э=E
::#Ю=Yu
::#Я=Ya
Имейте в виду, что скрипт должен быть сохранён в кодировке 866, это важно. Все пробелы заменяются на нижние подчеркивания, а кириллица - транслитерируется в латиницу (ГОСТ 7.79-2000, система Б) согласно таблице. Используется много вызовов Find, поэтому производительность скрипта оставляет желать лучшего.
Образец вызова скрипта:
Код:
@Echo Off
Set Filename=Новый текстовый документ.txt
Echo Old filename = %Filename%
For /F "delims=" %%A In ('func_translit "%Filename%"') Do (Set Filename=%%A)
Echo New filename = %Filename%
Pause
|
Цитата:
Цитата Anonymоus
Используется много вызовов Find, поэтому производительность скрипта оставляет желать лучшего. »
|
Ускорил:
Код:
@Echo Off
:: Inquisitor, 2013
SetLocal EnableDelayedExpansion
:: Первый аргумент служит в качестве входящих данных.
Set Data=%~1
:: Проверяем на то, передан ли аргумент и заменяем пробелы на нижнее
:: подчеркивание.
If Defined Data (Set Data=!Data: =_!) Else (Exit /B 1)
For %%I In (a_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya А_A Б_B В_V Г_G Д_D Е_E Ё_Yo Ж_Zh З_Z И_I Й_I К_K Л_L М_M Н_N О_O П_P Р_R С_S Т_T У_U Ф_F Х_Kh Ц_C Ч_Ch Ш_Sh Щ_Sh Ъ_. Ы_Y Ь_. Э_E Ю_Yu Я_Y) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do Set Data=!Data:%%A=%%B!
Echo !Data!
Exit /B 0
|
gora, браво, превосходно! Мне такой вариант решения даже в голову не пришел.
|
Anonymоus, gora,
Благодарю выручили!!!
|
Рано. Там не все так гладко как оказалось... :( Надо еще поковырять и исправить.
|
рано обрадовался :(
и попутно вопрос: как можно это применить к списку файлов? (обработать все файлы в указанной папке)
|
Код:
@Echo Off
:: Кодировка файла Кириллица DOS (866)
SetLocal EnableDelayedExpansion
:: Путь к обрабатываемой папке
Set Folder=e:\Temp\3 3
:: При замене командой SET (как выяснилось) заглавные и маленькие буквы не различаются
:: Всвязи с этим не смысла использовать полный список (с маленькими и заглавными буквами), достаточно любой половины
:: Здесь использована половина с маленькими буквами, поэтому после транслитерации новые имена окажутся в нижнем регистре
:: Если требуются имена в верхнем регистре, то следует использовать половину с заглавными буквами
:: Список замен
:: Set preset=а_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya А_A Б_B В_V Г_G Д_D Е_E Ё_Yo Ж_Zh З_Z И_I Й_I К_K Л_L М_M Н_N О_O П_P Р_R С_S Т_T У_U Ф_F Х_Kh Ц_C Ч_Ch Ш_Sh Щ_Sh Ъ_. Ы_Y Ь_. Э_E Ю_Yu Я_Ya
Set preset=а_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya
:: После проверки слово ECHO удалить
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:-D "%folder%"') Do (
Call :_translit "%%~nA"
Echo Ren "%%A" "!Data!%%~xA"
)
Pause
Exit
:_translit
Set Data=%~1
Set Data=%Data: =_%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do Set Data=!Data:%%A=%%B!
GoTo :EOF
|
gora, попытался с двумя файлами:
Текстовый документ.txt
и
Документ Microsoft Office Word.docx
на выходе:
vекbvовlй_докgменv.txt
и
Докgменv_Microsoft_Office_Word.docx
|
zion87, у меня так:
Может кодировка при копировании с форума бьется? Вот файл
Какая у Вас система, русская? И что выдает команда ChCp в консоли?
|
Да с этим файлом все на УРА!!!
|
Код:
@Echo Off
:: Кодировка файла Кириллица DOS (866)
SetLocal EnableDelayedExpansion
:: Путь к обрабатываемой папке
Set Folder=e:\Temp\1
:: Список замен
Set preset=а_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya А_A Б_B В_V Г_G Д_D Е_E Ё_Yo Ж_Zh З_Z И_I Й_I К_K Л_L М_M Н_N О_O П_P Р_R С_S Т_T У_U Ф_F Х_Kh Ц_C Ч_Ch Ш_Sh Щ_Sh Ъ_. Ы_Y Ь_. Э_E Ю_Yu Я_Ya
:: После проверки слово ECHO удалить
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:-D "%folder%"') Do (
Call :_translit "%%~nA"
Echo Ren "%%A" "!Result!%%~xA"
)
Pause
Exit
:_translit
Set Data=%~1
Set Data=%Data: =_%
Set Result=
:_loop
Set Char=%Data:~,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B
Set Result=%Result%%Char%
Set Data=%Data:~1%
If Defined Data GoTo _loop
GoTo :EOF
|
1 - пару Я_Ya в конце таблицы preset упустил;
2 - если в предпоследнем If использовать при сравнении кавычки, то отпадает необходимость замены пробелов на символ подчеркивания.
Код:
@Echo Off
:: Кодировка файла Кириллица DOS (866)
SetLocal EnableDelayedExpansion
:: Путь к обрабатываемой папке
Set Folder=e:\Temp\1
:: Список замен
Set preset=^
а_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya^
А_A Б_B В_V Г_G Д_D Е_E Ё_Yo Ж_Zh З_Z И_I Й_I К_K Л_L М_M Н_N О_O П_P Р_R С_S Т_T У_U Ф_F Х_Kh Ц_C Ч_Ch Ш_Sh Щ_Sh Ъ_. Ы_Y Ь_. Э_E Ю_Yu Я_Ya
:: После проверки слово ECHO удалить
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:-D "%folder%"') Do (
Call :_translit "%%~nA"
Echo Ren "%%A" "!Result!%%~xA"
)
Pause
Exit
:_translit
Set Data=%~1
Set Result=
:_loop
Set Char=%Data:~,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If "%Char%"=="%%A" Set Char=%%B
Set Result=%Result%%Char%
Set Data=%Data:~1%
If Defined Data GoTo _loop
GoTo :EOF
Кстати, какой тег следует использовать для подсветки синтаксиса cmd? Я не нашел среди "тегов форума"...
|
gora,
Ему решать...
А как насчет этого:
Цитата:
Цитата nsky
Кстати, какой тег следует использовать для подсветки синтаксиса cmd? Я не нашел среди "тегов форума"... »
|
|
velmyshanovnyi |
20-01-2019 00:40 2853366 |
небольшой апдейт для универсальности ))
просьба обновить по указанным ссылкам
HTML код:
rem ====================
rem // http://forum.oszone.net/thread-252100-2.html
rem // http://www.cyberforum.ru/cmd-bat/thread671391-page2.html#post4256934
rem ====================
rem Список замен
rem UPDATE from:
rem https://en.wikipedia.org/wiki/Cyrillic_script
rem https://uk.wikipedia.org/wiki/Кирилиця
rem https://ru.wikipedia.org/wiki/Кириллица
rem ====================
Set preset=а_a б_b в_v г_g ґ_g ѓ_gj д_d ђ_dj е_e є_ie ё_yo ж_zh з_z и_i і_i ї_ji й_i к_k л_l љ_lj м_m н_n њ_nj о_o п_p р_r с_s т_t ќ_c ћ_c у_u ф_f х_kh ц_c ч_ch џ_dz ш_sh щ_shch ъ_. ы_y ь_' э_e ю_yu я_ia А_A Б_B В_V Г_G Ґ_G Ѓ_Gj Д_D Ђ_Dj Е_E Є_Ye Ё_Yo Ж_Zh З_Z И_I І_I Ї_Ji Й_I К_K Л_L Љ_Lj М_M Н_N Њ_Nj О_O П_P Р_R С_S Т_T Ќ_C Ћ_C У_U Ф_F Х_Kh Ц_C Ч_Ch Џ_Dz Ш_Sh Щ_Shch Ъ_. Ы_Y Ь_' Э_E Ю_Yu Я_Ya
rem ====================
|
Время: 00:40.
© OSzone.net 2001-