У меня есть целая куча файлов, в именах которых используются наши прекрасные шведские буквы å å и ö.
По разным причинам мне теперь нужно преобразовать их в диапазон [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, но пока не повезло), и замена этих символов не тоже помогите.
Как бы вы решили эту проблему? Я открыт для любых инструментов, командной строки или чего-то еще ...
Обновлено: Это разовая проблема, поэтому я ищу быстрое некрасивое решение





Я бы написал это на C++, C# или Java - средах, где я точно знаю, что вы можете правильно вывести символы Unicode из пути. С инструментами командной строки, особенно в Cygwin, всегда нет никаких вопросов.
Тогда код представляет собой простой поиск / замену или регулярное выражение / замену. Если бы вы могли назвать язык, было бы легко написать код.
Я бы написал vbscript (WSH) для сканирования каталогов, затем отправил имена файлов функции, которая разбивает имена файлов на отдельные буквы, затем выполняет SELECT CASE для шведских и заменяет их на те, которые вы хотите. Или вместо этого функция могла бы просто передать его через кучу функций REPLACE (), переназначив вывод входной строке. В конце он переименовывает файл с новым значением.
Возможно, вам повезет с cmd.exe, если вы откроете его в режиме UNICODE. Используйте "cmd / U".
Другие предложили использовать настоящий язык программирования. Это нормально, особенно если у вас очень удобный язык. Мой друг из команды C# говорит, что C# 3.0 (с Linq) хорошо подходит для создания быстрых небольших программ, подобных этой. Большую часть времени он перестал писать командные файлы.
Лично я бы выбрал PowerShell. Эту проблему можно решить прямо из командной строки, причем одной строкой. Больной
Обновлено: это не одна строка, но и кода не так много. Кроме того, похоже, что StackOverflow не нравится синтаксис «$ _. Name», и он отображает _ как & # 95.
$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.
}
Вы можете использовать этот код (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)
###
Вам нужно изменить кодировку и таблицы символов (я тестировал этот скрипт с испанскими файлами, и он отлично работает). Вы можете прокомментировать строку «переместить», чтобы проверить, работает ли она нормально, и удалить комментарий позже, чтобы выполнить переименование.