Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Скрипт для переименовывания файлов с латиницы на русский лад

Ответить
Настройки темы
Любой язык - Скрипт для переименовывания файлов с латиницы на русский лад

Старожил


Сообщения: 421
Благодарности: 5

Профиль | Отправить PM | Цитировать


Привет!
Вот на скрине можно увидеть много файлов формата fb2 подписанных латиницей.

Возможен ли скрипт создать (или как, правильне bat - ник ?) который бы "переподписал" эти самые файлы русскими буквами?
Причем в именах файлов-книг были бы только названия книг без автора.
Такое реально вообще-то?

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:10, 05-01-2021

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6690
Благодарности: 1566

Профиль | Отправить PM | Цитировать


Реально, но это будет очень криво, и лучше оставить как есть.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:22, 05-01-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Latinyanin:
файлы русскими буквами? »
В принципе, есть скрипт выполняющий транслитерацию по ГОСТ, но да, как выше сказали, результат будет очень кривым, потому как именуют файлы вне всяких стандартов, т.е. в итоге можете получить не слово на кириллице, а нечитаемый набор символов...

Цитата Latinyanin:
Причем в именах файлов-книг были бы только названия книг без автора.
Такое реально вообще-то? »
Если всегда в начале наименования файла присутствует фамилия автора и только фамилия, без инициалов и прочих дополнительных маркировок, то вполне:
powershell
Код: Выделить весь код
$folder = '.\BOOKS'
$flt = '*.fb2'
dir $folder -filter $flt|
ren -new {($_.basename -replace '^[^_]*_' -replace '\.\d+$') + $_.extension}

-------
scio me nihil scire. Ѫ


Отправлено: 11:53, 06-01-2021 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Коллеги, это опять fb2, то бишь, надо смотреть внутрь xml и брать содержимое тэгов author (/FictionBook/description/title-info/author/first-name, /FictionBook/description/title-info/author/middle-name
/FictionBook/description/title-info/author/last-name) и /FictionBook/description/title-info/book-title.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:54, 06-01-2021 | #4


Аватара для Fors1k

Старожил


Сообщения: 193
Благодарности: 112

Профиль | Отправить PM | Цитировать


Цитата Iska:
надо смотреть внутрь xml »
Код: Выделить весь код
param(
    $path = 'D:\books'
)cls

(gci -File "$path\*.fb2").FullName|%{
    ren $_ (([xml](gc -en UTF8 $_)).FictionBook.description.'title-info'.'book-title'+'.fb2')
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:06, 06-01-2021 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Fors1k, кодировка файлов может быть как ANSI/1251, так и UTF-8/65001.

Отправлено: 18:22, 06-01-2021 | #6


Аватара для Fors1k

Старожил


Сообщения: 193
Благодарности: 112

Профиль | Отправить PM | Цитировать


Цитата Iska:
кодировка файлов может быть как ANSI »
Я доселе не встречал.
Код: Выделить весь код
param(
    $path = 'D:\books'
)cls

(gci -File "$path\*.fb2").FullName|%{$book=[xml]::new()}{
    $book.Load($_)
    ren $_ ($book.FictionBook.description.'title-info'.'book-title'+'.fb2')
}

Последний раз редактировалось Fors1k, 06-01-2021 в 20:10.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:47, 06-01-2021 | #7


Старожил


Сообщения: 232
Благодарности: 21

Профиль | Отправить PM | Цитировать


Latinyanin, всё это элементарно делается специальным софтом для работы с FB2. Не нужны никакие скрипты, да и разобраться неподготовленному юзеру будет проще.
К примеру возьмите эту утилиту - FB2Toolbox , она наиболее подходит для Вашей задачи. Хотя, как выше заметил ув. Iska, всё зависит от структуры файла, как в файле указан тэг author
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:04, 07-01-2021 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Fors1k:
Я доселе не встречал. »
Увы, бывает.

Как и неописанный namespace внутри fb2 .

Отправлено: 04:26, 07-01-2021 | #9


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Iska:
Увы, бывает. »
Это да, точно...
По мотивам этого топика и идее Iska, "состряпал" скрипт. Не идеальный, со своими недостатками, но свою функцию выполняет на тех файлах, которые у меня давно хранились в куче, безо всякого порядка...
Что делает:
1. Читает рекурсивно каталог на предмет файлов, архивов *.zip, *.fbz (возможно указать другие расширения, но распаковывать будет только формат zip), распаковывает архивы, удаляет их.
2. Считывает fb2.
3. Создает структуру каталогов в формате:
<корневой каталог $out>\<author.'last-name'> <author.'first-name'>\
При наличии авторов более одного, для именования каталога, будет использоваться только первый по списку.
Далее, при наличии серии, создает подкаталог с именем <sequence.name>
4. Перемещает книги в соответствующие каталоги с переименованием, в формате:
<sequence.number>_<sequence.name>_<'book-title'>
5. Упаковывает книги в формате zip (при наличии ключа -fbz)
6. Переименовывает расширение у архивов с книгами из .zip в .fbz (при наличии ключа -fbz. Расширение возможно указать любое другое)

Если в исходном каталоге имелась структура каталогов, её придется удалять вручную... не стал заморачиваться с доп.проверками на "пустой - не пустой"... при желании, можно прикрутить, сложности большой в том нет...

script.ps1
Код: Выделить весь код
# http://forum.oszone.net/post-2945350.html#post2945350
# Изменен 15.01.2021
# Примеры запуска из консоли powershell:
# с архивацией целевых файлов:
# .\script.ps1 -in "D:\Books" -out "D:\Out" -fbz
# без архивации:
# .\script.ps1 -in "D:\Books" -out "D:\Out"

param(
	[string]$in = '.\BOOKS',
	[string]$out = '.\BOOKS_OUT',
	[string[]]$include = ('*.fbz','*.zip'),
	[switch]$fbz
)
function expand-zip {
	process {
		try{
			if ($_.extension -match '\.fbz|\.zip'){
				if ($_.extension -eq '.fbz'){ren $_.fullname $($_.basename+'.zip')}
				$zip = gi $($_.fullname -replace '\.fbz','.zip')
				expand-archive $zip.fullname $zip.directoryname -ea 1
				del $zip
			}
		} catch {
			write-host "ошибка: $_" -for red
		}
	}
}
# https://docs.microsoft.com/ru-ru/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN
$except = '\[|\]|<|>|\*|\"|:|\?|\\|/|\|'
if (!(test-path $out -patht 'Container')){$null = md $out}
$folder = gi $out
dir $in -inc $include -file -rec|expand-zip

dir $in -inc '*.fb2' -file -rec|%{
	$arch,$b,$d,$d_author,$ser = $null,$null,$null,$null,$null
	if ((gc $_.fullname -tot 1) -match 'windows-1251'){
		if ($pscore = $psversiontable.psversion.major -gt 5){
			$encoding = 'windows-1251'
		} else {$encoding = 'default'}
	} else {$encoding = 'utf8'}
	$book = ([xml](gc $_.fullname -enc $encoding)).fictionbook.description.'title-info'
	$d = $folder.fullname+'\'+(
		(([array]$book.author)[0].'last-name'+' '+([array]$book.author)[0].'first-name') -replace $except
	)
	if(!(test-path $d -patht 'Container')){$d_author = md $d} else {$d_author = gi $d}
	if ($book.sequence.number){
		$b = $d_author.fullname+'\'+($book.sequence.name -replace ' ','-' -replace $except)
		if(!(test-path $b -patht 'Container')){$ser = md $b} else {$ser = gi $b}
		$new = $ser.fullname+'\'+$book.sequence.number+'_'+(
			(($book.sequence.name -replace ' ','-')+'_'+$book.'book-title')  -replace $except
		)+$_.extension
	} else {
		$new = $d_author.fullname+'\'+($book.'book-title' -replace $except)+$_.extension
	}
	try{mi $_.fullname $new -ea 1} catch {write-host Ошибка: $new - $_ -for red}
	$arch = gi $new
	if ($fbz){
		try{
			compress-archive $arch.fullname $($arch.directoryname+'\'+$arch.basename+'.zip') -ea 1
			del $arch
		} catch {
			write-host Ошибка: $($arch.directoryname+'\'+$arch.basename+'.zip') - $_ -for red
		}
	}
}
dir $folder.fullname -filt '*.zip' -file -rec|ren -new {$_.basename+'.fbz'}

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 15-01-2021 в 11:11. Причина: изменения в скрипте

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:58, 08-01-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Скрипт для переименовывания файлов с латиницы на русский лад

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Скрипт для автоматиеского копированеи файлов на удаленный сервер tutitam Скриптовые языки администрирования Windows 12 19-02-2013 15:09
VBS/WSH/JS - нужен vbs скрипт для отпраки файлов на mail exekill Скриптовые языки администрирования Windows 0 18-04-2012 16:28
Разное - [решено] Ищу программу для переименовывания файлов flower Программное обеспечение Windows 15 08-07-2010 18:40
Ищу программу переименовывания файлов venuko Хочу все знать 3 04-06-2009 19:44
Скрипт для копирования файлов с 1 сервера на несколько andro_id Программирование в *nix 2 04-09-2008 11:48




 
Переход