Пакетное переименование файлов с международными символами в Windows XP
-
09-06-2019 - |
Вопрос
У меня есть целая куча файлов, имена которых состоят из наших прекрасных шведских букв. å å и ö.По разным причинам мне теперь нужно преобразовать их в диапазон [a-zA-Z].Просто удалить все, что находится за пределами этого диапазона, довольно легко.Меня беспокоит то, что я хотел бы заменить å с а, ö с о и так далее.
Это худшие проблемы с кодировкой.
У меня есть набор тестовых файлов:
files\Copy of New Text Documen åäö t.txt
files\fofo.txt
files\New Text Document.txt
files\worstcase åäöÅÄÖéÉ.txt
Я основываю свой скрипт на этой строке, передавая ее результаты в различные команды.
for %%X in (files\*.txt) do (echo %%X)
Странно то, что если я распечатаю результаты этого (то есть простого цикла for) в файл, я получу такой вывод:
files\Copy of New Text Documen †„” t.txt
files\fofo.txt
files\New Text Document.txt
files\worstcase †„”Ž™‚.txt
Итак, что-то странное происходит с моими именами файлов еще до того, как они достигают других инструментов (я пытался сделать это, используя порт sed для Windows из чего-то под названием GnuWin32, но пока безуспешно), и замена этих символов не дает результатов. помогите же.
Как бы вы решили эту проблему?Я открыт для любого типа инструментов, командной строки или чего-то еще…
РЕДАКТИРОВАТЬ: Это единовременная проблема, поэтому я ищу быстрое и некрасивое решение.
Решение
Вы можете использовать этот код (Python)
Переименуйте международные файлы
# -*- coding: cp1252 -*-
import os, shutil
base_dir = "g:\\awk\\" # Base Directory (includes subdirectories)
char_table_1 = "áéíóúñ"
char_table_2 = "aeioun"
adirs = os.walk (base_dir)
for adir in adirs:
dir = adir[0] + "\\" # Directory
# print "\nDir : " + dir
for file in adir[2]: # List of files
if os.access(dir + file, os.R_OK):
file2 = file
for i in range (0, len(char_table_1)):
file2 = file2.replace (char_table_1[i], char_table_2[i])
if file2 <> file:
# Different, rename
print dir + file, " => ", file2
shutil.move (dir + file, dir + file2)
###
Вам необходимо изменить кодировку и таблицы символов (я тестировал этот сценарий на испанских файлах, и он работает нормально).Вы можете прокомментировать строку «переместить», чтобы проверить, работает ли она нормально, а позже удалить комментарий, чтобы выполнить переименование.
Другие советы
Возможно, вам повезет больше с cmd.exe, если вы откроете его в режиме UNICODE.Используйте «cmd/U».
Другие предложили использовать настоящий язык программирования.Это нормально, особенно если у вас есть язык, на котором вам очень комфортно.Мой друг из команды C# говорит, что C# 3.0 (с Linq) хорошо подходит для создания быстрых небольших программ, подобных этой.Большую часть времени он перестал писать пакетные файлы.
Лично я бы выбрал PowerShell.Эту проблему можно решить прямо в командной строке, причем в одной строке.Больной
РЕДАКТИРОВАТЬ:это не одна строка, но и не так много кода.Кроме того, похоже, что StackOverflow не нравится синтаксис «$_.Name» и отображает _ как _.
$mapping = @{
"å" = "a"
"ä" = "a"
"ö" = "o"
}
Get-ChildItem -Recurse . *.txt | Foreach-Object {
$newname = $_.Name
foreach ($l in $mapping.Keys) {
$newname = $newname.Replace( $l, $mapping[$l] )
$newname = $newname.Replace( $l.ToUpper(), $mapping[$l].ToUpper() )
}
Rename-Item -WhatIf $_.FullName $newname # remove the -WhatIf when you're ready to do it for real.
}
Я бы написал это на C++, C# или Java — в средах, где я точно знаю, что вы можете правильно извлечь символы Юникода из пути.Всегда неясно с инструментами командной строки, особенно из Cygwin.
Тогда код представляет собой простой поиск/замену или регулярное выражение/замену.Если вы можете назвать язык, написать код будет легко.
Я бы написал vbscript (WSH) для сканирования каталогов, затем отправил имена файлов в функцию, которая разбивает имена файлов на отдельные буквы, затем выполняет SELECT CASE для шведских и заменяет их теми, которые вы хотите.Или вместо этого функция может просто пропустить его через группу функций REPLACE(), переназначив вывод входной строке.В конце он переименовывает файл с новым значением.