|
Компьютерный форум OSzone.net » Компьютеры + Интернет » Хочу все знать » [решено] Total Commander Как осуществить групповую транслитерацию по списку из файла? |
|
|
[решено] Total Commander Как осуществить групповую транслитерацию по списку из файла?
|
Новый участник Сообщения: 24 |
Добрый день, есть следующая ситуация:
Сетевая шара переезжает с десктопной машины Windows на линуксовое сетевое хранилище. В старой сетевой шаре по разным каталогами разбросано примерно 300 файлов названия которых в основном состоят из одной кириллицы, с количеством символов от 128 до 255. Проблема заключается в том, что сетевое хранилище их принять откажется, потому что имя файла в ext4/btrfs должно содержать не большее 255 байт. А символ кириллицы в UTF-8 занимает 2 байта. С помощью плагина fileX для Total Commander был получен весь список файлов которые нужно переименовать. Был найден плагин (wdx_Translit), который упрощает групповую автозамену, делает процесс практически автоматическим. Но осталось решить один вопрос: как переименовывать файлы не по выделению а по списку в файле? Потому что переименовывать десятки тысяч файлов не нужно, а цеплять нужные из разных папок в GUI очень муторно. Нужно как-то скормить список. Если это решается через Bat, Powershell, Far либо любым другим способом из под винды, пожалуйста, все равно дайте знать. |
|
Отправлено: 17:42, 23-04-2020 |
Crazy Сообщения: 1227
|
Профиль | Отправить PM | Цитировать Цитата michsh@vk:
Только необходимы уточнения... примеры из листинга (в наличии ли там полные пути к файлам?), кодировка самого файла-списка. Что требуется в итоге? Транслитерация или простое обрезание наименования? |
|
------- Отправлено: 18:17, 23-04-2020 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 24
|
Профиль | Сайт | Отправить PM | Цитировать YuS_2,
1. Условный пример: пути выглядят так: \\Michsh-pc\d\тест\авып впы 112434125 dfgfd.txt \\Michsh-pc\d\тест\авып впы 112434125 dfgfd — копия.txt \\Michsh-pc\d\тест\авып впы 112434125 dfgfd — копия (2).txt Только в реальности шара идет через IP-адрес а не доменное имя. 2. Список сохранен в UTF-8 3. Боюсь, требуется именно транслитерация как самый компромиссный вариант. Благодарю! --- Пока прошу подождать с решением. Сейчас будет уточняться нужна транслитерация или обрезка имени. |
Последний раз редактировалось michsh@vk, 23-04-2020 в 19:25. Отправлено: 18:39, 23-04-2020 | #3 |
Crazy Сообщения: 1227
|
Профиль | Отправить PM | Цитировать Цитата michsh@vk:
script.ps1
function translit { param( [parameter(mandatory=$true,valuefrompipeline=$true)] [allowemptystring()] [allownull()] [string]$fstring, [switch]$reverse ) begin { $arr1 = @( '8979','89111','121111','9072','90104','122104','6790','67122','99122','6772', '67104','99104','8372','83104','115104','837272','83104104','115104104','9696','8996', '12196','6996','10196','8985','89117','121117','8965','8997','12197' ) $charr = @{ [char]'А' = 'A' [char]'а' = 'a' [char]'Б' = 'B' [char]'б' = 'b' [char]'В' = 'V' [char]'в' = 'v' [char]'Г' = 'G' [char]'г' = 'g' [char]'Д' = 'D' [char]'д' = 'd' [char]'Е' = 'E' [char]'е' = 'e' [char]'Ё' = 'YO' [char]'ё' = 'yo' [char]'Ж' = 'ZH' [char]'ж' = 'zh' [char]'З' = 'Z' [char]'з' = 'z' [char]'И' = 'I' [char]'и' = 'i' [char]'Й' = 'J' [char]'й' = 'j' [char]'К' = 'K' [char]'к' = 'k' [char]'Л' = 'L' [char]'л' = 'l' [char]'М' = 'M' [char]'м' = 'm' [char]'Н' = 'N' [char]'н' = 'n' [char]'О' = 'O' [char]'о' = 'o' [char]'П' = 'P' [char]'п' = 'p' [char]'Р' = 'R' [char]'р' = 'r' [char]'С' = 'S' [char]'с' = 's' [char]'Т' = 'T' [char]'т' = 't' [char]'У' = 'U' [char]'у' = 'u' [char]'Ф' = 'F' [char]'ф' = 'f' [char]'Х' = 'X' [char]'х' = 'x' [char]'Ц' = 'C' [char]'ц' = 'c' [char]'Ч' = 'CH' [char]'ч' = 'ch' [char]'Ш' = 'SH' [char]'ш' = 'sh' [char]'Щ' = 'SHH' [char]'щ' = 'shh' [char]'Ъ' = '``' [char]'ъ' = '``' [char]'Ы' = 'Y`' [char]'ы' = 'y`' [char]'Ь' = '`' [char]'ь' = '`' [char]'Э' = 'E`' [char]'э' = 'e`' [char]'Ю' = 'YU' [char]'ю' = 'yu' [char]'Я' = 'YA' [char]'я' = 'ya' } $revcharr = @{ [char]'A' = 'А' [char]'a' = 'а' [char]'B' = 'Б' [char]'b' = 'б' [char]'V' = 'В' [char]'v' = 'в' [char]'G' = 'Г' [char]'g' = 'г' [char]'D' = 'Д' [char]'d' = 'д' [char]'E' = 'Е' [char]'e' = 'е' $(-join [int[]][char[]]'YO') = 'Ё' <#89-79#> $(-join [int[]][char[]]'Yo') = 'Ё' <#89-111#> $(-join [int[]][char[]]'yo') = 'ё' <#121-111#> $(-join [int[]][char[]]'ZH') = 'Ж' <#90-72#> $(-join [int[]][char[]]'Zh') = 'Ж' <#90-104#> $(-join [int[]][char[]]'zh') = 'ж' <#122-104#> [char]'Z' = 'З' [char]'z' = 'з' [char]'I' = 'И' [char]'i' = 'и' [char]'J' = 'Й' [char]'j' = 'й' [char]'K' = 'К' [char]'k' = 'к' [char]'L' = 'Л' [char]'l' = 'л' [char]'M' = 'М' [char]'m' = 'м' [char]'N' = 'Н' [char]'n' = 'н' [char]'O' = 'О' [char]'o' = 'о' [char]'P' = 'П' [char]'p' = 'п' [char]'R' = 'Р' [char]'r' = 'р' [char]'S' = 'С' [char]'s' = 'с' [char]'T' = 'Т' [char]'t' = 'т' [char]'U' = 'У' [char]'u' = 'у' [char]'F' = 'Ф' [char]'f' = 'ф' [char]'X' = 'Х' [char]'x' = 'х' [char]'C' = 'Ц' $(-join [int[]][char[]]'CZ') = 'Ц' <#67-90#> $(-join [int[]][char[]]'Cz') = 'Ц' <#67-122#> [char]'c' = 'ц' $(-join [int[]][char[]]'cz') = 'ц' <#99-122#> $(-join [int[]][char[]]'CH') = 'Ч' <#67-72#> $(-join [int[]][char[]]'Ch') = 'Ч' <#67-104#> $(-join [int[]][char[]]'ch') = 'ч' <#99-104#> $(-join [int[]][char[]]'SH') = 'Ш' <#83-72#> $(-join [int[]][char[]]'Sh') = 'Ш' <#83-104#> $(-join [int[]][char[]]'sh') = 'ш' <#115-104#> $(-join [int[]][char[]]'SHH') = 'Щ' <#83-72-72#> $(-join [int[]][char[]]'Shh') = 'Щ' <#83-104-104#> $(-join [int[]][char[]]'shh') = 'щ' <#115-104-104#> #[char]'' = 'Ъ' $(-join [int[]][char[]]'``') = 'ъ' <#96-96#> $(-join [int[]][char[]]'Y`') = 'Ы' <#89-96#> $(-join [int[]][char[]]'y`') = 'ы' <#121-96#> #[char]'`' = 'Ь' [char]'`' = 'ь' $(-join [int[]][char[]]'E`') = 'Э' <#69-96#> $(-join [int[]][char[]]'e`') = 'э' <#101-96#> $(-join [int[]][char[]]'YU') = 'Ю' <#89-85#> $(-join [int[]][char[]]'Yu') = 'Ю' <#89-117#> $(-join [int[]][char[]]'yu') = 'ю' <#121-117#> $(-join [int[]][char[]]'YA') = 'Я' <#89-65#> $(-join [int[]][char[]]'Ya') = 'Я' <#89-97#> $(-join [int[]][char[]]'ya') = 'я' <#121-97#> } } process { if($reverse){ $f2,$f3,$j,$m = $true,$true,0,0 $cnt = $fstring.tochararray().length $arrtmp = $fstring.tochararray() for($i=0;$i -lt $cnt;$i++){ if ($f2 -and $f3 -and $arr1 -match "^$([int][char]$arrtmp[$i])") { if (($i+2) -lt $cnt){ for ($k=0;$k -le 2;$k++){ [string]$str += "$([int][char]$arrtmp[($i+$k)])" } if ($arr1 -contains $str){$f3 = $false} $str = $null } if (($i+1) -lt $cnt -and $f3){ for ($l=0;$l -le 1;$l++){ [string]$str += "$([int][char]$arrtmp[($i+$l)])" } if ($arr1 -contains $str){$f2 = $false} $str = $null } } if (!$f3){ [string]$str += "$([int][char]$arrtmp[$i])";$j++ if ($j -ge 3){ $f3 = $true;$j = 0 $arr += $revcharr[$str] $str = $null } } elseif (!$f2){ [string]$str += "$([int][char]$arrtmp[$i])";$m++ if ($m -ge 2){ $f2 = $true;$m = 0 $arr += $revcharr[$str] $str = $null } } else { if ($revcharr[$arrtmp[$i]] -cne $null){ $arr += $revcharr[$arrtmp[$i]] } else { $arr += $arrtmp[$i] } } } $arr += "`n" } else { $fstring.tochararray()|%{ if ($charr[$_] -cne $null){ $arr += $charr[$_] } else { $arr += $_ } } $arr += "`n" } } end {write-output $arr.trim("`n")} } $list = 'file_list.txt' gi (gc $list -enc utf8)|ren -new {($_.basename|translit)+$_.extension} |
|
------- Последний раз редактировалось YuS_2, 23-04-2020 в 20:29. Отправлено: 19:26, 23-04-2020 | #4 |
Новый участник Сообщения: 24
|
Профиль | Сайт | Отправить PM | Цитировать YuS_2, прощу прощения, что не успел Вас предупредить раньше. Спасибо большое за помощь.
|
|
Отправлено: 22:35, 23-04-2020 | #5 |
Новый участник Сообщения: 24
|
Профиль | Сайт | Отправить PM | Цитировать YuS_2, скажите, пожалуйста, а у вас есть возможность показать решение через скрипт?
Если да, то заодно интересно, а что будет происходить с файлами, если после обрезки их названия станут одинаковыми? |
Отправлено: 10:03, 24-04-2020 | #6 |
Crazy Сообщения: 1227
|
Профиль | Отправить PM | Цитировать Цитата michsh@vk:
Скрипт приведен выше... скрипту нужны только данные из файла-списка. Ну и естественно, права доступа, иначе переименовать не получиться. Цитата michsh@vk:
|
||
------- Отправлено: 11:24, 24-04-2020 | #7 |
Новый участник Сообщения: 24
|
Профиль | Сайт | Отправить PM | Цитировать YuS_2, простите голова кругом пошла.
Я имел ввиду можете ли вы показать, как будет выглядеть скрипт на обрезание файлов? В прочем, пока текущее ТЗ "плавает" я нашел способ сделать это через Total Commander. Чуть позже я выложу решение без использования скрипта, но и без самого списка с файлами. Так как нашел как вынести все найденные по критерию файлы на панель в самом Total Commander. Это была моя ошибка связанная с нехваткой опыта и недостаточной внимательностью в работе с ним. Еще раз, благодарю вас за помощь) |
Отправлено: 15:59, 24-04-2020 | #8 |
Crazy Сообщения: 1227
|
Профиль | Отправить PM | Цитировать Цитата michsh@vk:
В данном случае, Вы задали правильный вопрос про обрезание наименований файлов, но ответ на него, должен исходить от Вас же... В общем, скрипта готового нет, но он не сложен по написанию и по структуре, при этом сильно будет зависеть, как раз, от предполагаемых, необходимых действий. |
|
------- Отправлено: 16:30, 24-04-2020 | #9 |
Новый участник Сообщения: 24
|
Профиль | Сайт | Отправить PM | Цитировать Как решить данный вопрос, НЕ используя файл со списком.
Для работы нужны плагины: FileX и wdx_Translit. 1. Установите плагины, добавив их в настройках Total Commander. 2. Выделите путь в Total Commander, зажать Backspace, чтобы появилась возможность ввести путь до сетевой шары вручную (либо, если шара подключена как объект, выберите ее из списка). 3. Выберите поиск файлов: 4. В качестве фильтра выберите FileX, выберите параметр длина имени, и укажите условие, что длина превышает 127 символов (если имя файла будет состоять, только из одной кириллицы без пробелов, то длина в 128 символов будет равна 256 байт для кодировки UTF-8) 5. Выберите после произведенного поиска - файлы на панель 6. После чего выделите нужные файлы и выберите групповое переименование. 7. Далее вы можете их как обрезать так и транслитировать: YuS_2, я Вас понял. Вы мне сильно помогли. Также только что я выложил альтернативный способ решить вопрос, до которого добрался. Надеюсь, Ваш скрипт или моя инструкция поможет не только мне но и другим пользователям. |
Последний раз редактировалось michsh@vk, 25-04-2020 в 00:34. Отправлено: 17:36, 24-04-2020 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Копирование файлов по списку из файла | foma24 | Скриптовые языки администрирования Windows | 2 | 30-12-2022 15:35 | |
Как изменить еденицы измерения в Total Commander (из КБ в МБ) | aau96@vk | Хочу все знать | 1 | 12-12-2015 10:20 | |
[решено] Total Commander. При выборе файла, открытие папки в другой панели. | NikolayHAOS | Хочу все знать | 5 | 04-04-2015 08:17 | |
CMD/BAT - [решено] Скачивание с FTP по списку из текстового файла | Angel_Ok | Скриптовые языки администрирования Windows | 3 | 23-08-2011 22:32 | |
[решено] Название файла в просмотрщике Total Commander изменяется! Почему? | truvo | Хочу все знать | 1 | 27-06-2008 00:37 |
|