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

Компьютерный форум OSzone.net » Компьютеры + Интернет » Хочу все знать » [решено] Total Commander Как осуществить групповую транслитерацию по списку из файла?

Ответить
Настройки темы
[решено] Total Commander Как осуществить групповую транслитерацию по списку из файла?

Новый участник


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

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


Добрый день, есть следующая ситуация:
Сетевая шара переезжает с десктопной машины Windows на линуксовое сетевое хранилище.
В старой сетевой шаре по разным каталогами разбросано примерно 300 файлов названия которых в основном состоят из одной кириллицы, с количеством символов от 128 до 255. Проблема заключается в том, что сетевое хранилище их принять откажется, потому что имя файла в ext4/btrfs должно содержать не большее 255 байт. А символ кириллицы в UTF-8 занимает 2 байта.
С помощью плагина fileX для Total Commander был получен весь список файлов которые нужно переименовать.
Был найден плагин (wdx_Translit), который упрощает групповую автозамену, делает процесс практически автоматическим.
Но осталось решить один вопрос: как переименовывать файлы не по выделению а по списку в файле?
Потому что переименовывать десятки тысяч файлов не нужно, а цеплять нужные из разных папок в GUI очень муторно. Нужно как-то скормить список.
Если это решается через Bat, Powershell, Far либо любым другим способом из под винды, пожалуйста, все равно дайте знать.

Отправлено: 17:42, 23-04-2020

 

Аватара для YuS_2

Crazy


Contributor


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

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


Цитата michsh@vk:
Powershell »
легко.
Только необходимы уточнения...
примеры из листинга (в наличии ли там полные пути к файлам?), кодировка самого файла-списка.
Что требуется в итоге? Транслитерация или простое обрезание наименования?

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

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

Отправлено: 18:17, 23-04-2020 | #2



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

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


Новый участник


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

Профиль | Сайт | Отправить 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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата michsh@vk:
требуется именно транслитерация как самый компромиссный вариант. »
Файл скрипта рекомендую сохранить в UTF-8 c BOM
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}

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


Последний раз редактировалось YuS_2, 23-04-2020 в 20:29.

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

Отправлено: 19:26, 23-04-2020 | #4


Новый участник


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

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


YuS_2, прощу прощения, что не успел Вас предупредить раньше. Спасибо большое за помощь.

Отправлено: 22:35, 23-04-2020 | #5


Новый участник


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

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


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

Отправлено: 10:03, 24-04-2020 | #6


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата michsh@vk:
есть возможность показать решение через скрипт? »
это как?
Скрипт приведен выше... скрипту нужны только данные из файла-списка. Ну и естественно, права доступа, иначе переименовать не получиться.

Цитата michsh@vk:
что будет происходить с файлами, если после обрезки их названия станут одинаковыми? »
Это Вы скажите, что надо с такими файлами делать...

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

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

Отправлено: 11:24, 24-04-2020 | #7


Новый участник


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

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


YuS_2, простите голова кругом пошла.
Я имел ввиду можете ли вы показать, как будет выглядеть скрипт на обрезание файлов?
В прочем, пока текущее ТЗ "плавает" я нашел способ сделать это через Total Commander. Чуть позже я выложу решение без использования скрипта, но и без самого списка с файлами.
Так как нашел как вынести все найденные по критерию файлы на панель в самом Total Commander. Это была моя ошибка связанная с нехваткой опыта и недостаточной внимательностью в работе с ним.
Еще раз, благодарю вас за помощь)

Отправлено: 15:59, 24-04-2020 | #8


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата michsh@vk:
можете ли вы показать, как будет выглядеть скрипт на обрезание файлов? »
Для того, чтобы написать скрипт, необходимо представлять себе алгоритм действий или хотя бы, конечный результат...
В данном случае, Вы задали правильный вопрос про обрезание наименований файлов, но ответ на него, должен исходить от Вас же...
В общем, скрипта готового нет, но он не сложен по написанию и по структуре, при этом сильно будет зависеть, как раз, от предполагаемых, необходимых действий.

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

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

Отправлено: 16:30, 24-04-2020 | #9


Новый участник


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

Профиль | Сайт | Отправить 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



Компьютерный форум OSzone.net » Компьютеры + Интернет » Хочу все знать » [решено] Total Commander Как осуществить групповую транслитерацию по списку из файла?

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход