Войти

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


Страниц : [1] 2 3

Latinyanin
05-01-2021, 15:10
Привет!
Вот на скрине можно увидеть много файлов формата fb2 подписанных латиницей.
https://i114.fastpic.ru/thumb/2021/0105/fb/0e69f6680bd7ad8ada2bca4719d257fb.jpeg (https://fastpic.ru/view/114/2021/0105/0e69f6680bd7ad8ada2bca4719d257fb.jpg.html)
Возможен ли скрипт создать (или как, правильне bat - ник ?) который бы "переподписал" эти самые файлы русскими буквами?
Причем в именах файлов-книг были бы только названия книг без автора.
Такое реально вообще-то?

https://www.upload.ee/images/dl_f.gif (https://www.upload.ee/files/12725746/_____.zip.html)

DJ Mogarych
05-01-2021, 15:22
Реально, но это будет очень криво, и лучше оставить как есть.

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

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

Iska
06-01-2021, 15:54
Коллеги, это опять 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.

Fors1k
06-01-2021, 17:06
надо смотреть внутрь xml »
param(
$path = 'D:\books'
)cls

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

Iska
06-01-2021, 18:22
Fors1k, кодировка файлов может быть как ANSI/1251, так и UTF-8/65001.

Fors1k
06-01-2021, 19:47
кодировка файлов может быть как 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')
}

Uragan66
07-01-2021, 01:04
Latinyanin, всё это элементарно делается специальным софтом для работы с FB2. Не нужны никакие скрипты, да и разобраться неподготовленному юзеру будет проще.
К примеру возьмите эту утилиту - FB2Toolbox (https://dl.dropbox.com/s/9iu8lj7ia6hxuyx/FB2Toolbox.zip) , она наиболее подходит для Вашей задачи. Хотя, как выше заметил ув. Iska, всё зависит от структуры файла, как в файле указан тэг author

Iska
07-01-2021, 04:26
Я доселе не встречал. »
Увы, бывает.

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

YuS_2
08-01-2021, 08:58
Увы, бывает. »
Это да, точно...
По мотивам этого топика и идее 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. Расширение возможно указать любое другое)

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

# 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'}

DJ Mogarych
08-01-2021, 09:11
Вероятно, надо предусмотреть присутствие в тэгах символов, которые не могут быть использованы в именах файлов и каталогов.

YuS_2
08-01-2021, 09:28
которые не могут быть использованы в именах файлов и каталогов. »
Да, тоже подумалось про это и даже частично сделал, здесь:
-replace '\[|\]'
Но искать список недопустимых символов было просто лень, а после тестов и приемлемой реализации, совсем лень одолела, т.к. на моих книгах не попалось таких символов... :)

Добавлено:
Собственно, fixed, здесь можно пополнять/редактировать:
$except = '\[|\]|<|>|\*|\"|:|\?|\\|/|\|'
- на основании этого (https://docs.microsoft.com/ru-ru/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN)

greg zakharov
08-01-2021, 19:56
Без оглядки на стандарты, беря во внимание исключительно конкретный случай, можно набросать на коленке примерно следующее:
function ConvertFrom-Translit {
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[String[]]$InputString
)

process {
$par, $map = ([Char[]]'cstyz'), @{
a = 49; b = 49; v = 68; g = 52; d = 48; e = 48;
yo = 40;
zh = 68;
z = 67; i = 49; y = 64;
k = 49; l = 49; m = 49; n = 49; o = 49; p = 49;
r = 50; s = 50; t = 50; u = 50;
f = 34; h = 35;
ts = 46;
ch = 28;
sh = 43;
sch = 42;
yi = 46;
yu = 43;
ya = 42
}

$InputString.ForEach{
[Text.Encoding]::Unicode.GetString(
$(for ($i = 0; $i -lt $_.Length; $i++) {
if ($_[$i] -eq '_') {
95, 0
continue
}

($_[$i] - $map["$($_[$i] -in $par ? $(
try { $itm = $_.Substring($i, ($$ = $_[$i + 1] -ceq 'c' ? 3 : 2)) } catch {}
$map.Contains($itm) ? $($itm; $i += (--$$)) : $_[$i]
) : $_[$i])"]), 4
})
)
}
}
}
Пример работы:

('Loginov_Dolina_Loreien.103821.fb2',
'Loginov_Doletet_do_epsilen_Tukana.142082.fb2',
'Loginov_Dom_u_dorogi.33523.fb2',
'Loginov_Dorogoy_shirokoy.69636.fb2',
'Loginov_Dragotsennee_mnogih_Meditsinskie_hroniki_.33524.fb',
'Loginov_Esche_o_vinegrete.22527.fb2',
'Loginov_Kolodez.22545.fb2',
'Loginov_Kommunalka.33546.fb2').ForEach{
$_ -replace '(^[^_]*_|\..*)'
} | ConvertFrom-Translit
Итог:
Долина_Лореиен
Долетет_до_епсилен_Тукана
Дом_у_дороги
Дорогой_широкою
Драгоценнее_многих_Медицинские_хроники_
Еще_о_винегрете
Колодез
Коммуналках
Как видно, проблема в определённых знаках вроде мягкого\твёрдого знака, а также буквы "э". Но, как говрится, это лучше чем ничего, т.е. отсутствие специфических тэгов в фикшн буке.
Более надёжный способ послать запрос в Google Translate (https://translate.google.ru/?sl=auto&tl=ru&text=Loginov_Kolodez.22545.fb2&op=translate) и забрать, скажем, Selenium'ом вполне себе нормально конвертированный текст. Хотя если есть API ключ, то можно с Selenium не заморачиваться, а брать конвертированный текст напрямую.

Latinyanin
09-01-2021, 14:59
Реально, но это будет очень криво, и лучше оставить как есть. »
как есть - не вариант

DJ Mogarych
10-01-2021, 11:31
Latinyanin, ну вперёд:
Долина_Лореиен
Долетет_до_епсилен_Тукана
Дом_у_дороги
Дорогой_широкою
Драгоценнее_многих_Медицинские_хроники_
Еще_о_винегрете
Колодез
Коммуналках »

YuS_2
10-01-2021, 11:34
как есть - не вариант »
тут кучу вариантов уже предложили... пользуйтесь тем, который устроит...

Latinyanin
14-01-2021, 14:47
Если всегда в начале наименования файла присутствует фамилия автора и только фамилия, без инициалов и прочих дополнительных маркировок, то вполне:
powershell » в том и дело, что окромя фамилии автора есть и имя и прочая,,,,информация.

тут кучу вариантов уже предложили... пользуйтесь тем, который устроит... »
только седня смог полностью все ответы прочесть, стараюсь всем ответить как могу

Latinyanin
14-01-2021, 15:06
Uragan66,
за утилиту спасибо - насчет сложно разобраться так у меня два скрипта мне норм работают пока

Iska
14-01-2021, 15:12
Latinyanin, да, я бы тоже опробовал вначале именно утилиту.

Latinyanin
14-01-2021, 15:27
Все-таки придется тупо вручную наверное переиеименовывать. Ни один из трех скриптов опыта не дал результата потребного. Хотя с другими книгами опыт был но все также поименованными латиницей

https://yadi.sk/d/QI5RAbZK9aDVnQ

но может не так оформил сам скрипт? Помещал в ту ж папку, что и файлы книг




© OSzone.net 2001-2012