Пакетное переименование файлов с международными символами в Windows XP - PullRequest
1 голос
/ 11 сентября 2008

У меня есть целая куча файлов с именами файлов с использованием наших прекрасных шведских букв å å и ö . По разным причинам мне сейчас нужно преобразовать их в диапазон [a-zA-Z]. Просто удалить что-либо за пределами этого диапазона довольно легко. Проблема в том, что я хочу заменить å на a , ö на o и так далее.

Это проблемы кодировки в их худшем.

У меня есть набор тестовых файлов:

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, но пока не повезло), и заменил эти символы тоже не помогает.

Как бы вы решили эту проблему? Я открыт для любого типа инструментов, командной строки или чего-то еще ...

РЕДАКТИРОВАТЬ: Это единовременная проблема, поэтому я ищу быстрое и безобразное исправление

Ответы [ 4 ]

1 голос
/ 11 сентября 2008

Вы можете использовать этот код (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)

###

Вы должны изменить кодировку и таблицы символов (я проверил этот скрипт с испанскими файлами и работает нормально). Вы можете прокомментировать строку «move», чтобы проверить, нормально ли она работает, и удалить комментарий позже, чтобы сделать переименование.

1 голос
/ 11 сентября 2008

Возможно, вам больше повезет в 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.
}
0 голосов
/ 11 сентября 2008

Я бы написал vbscript (WSH) для сканирования каталогов, затем отправил бы имена файлов в функцию, которая разбивает имена файлов на отдельные буквы, затем сделал SELECT CASE для шведских и заменил их теми, которые вы хочу. Или, вместо того, чтобы делать это, функция могла просто отбросить ее через кучу функций REPLACE (), переназначив выходные данные входной строке. В конце он переименовывает файл с новым значением.

0 голосов
/ 11 сентября 2008

Я написал бы это в C ++, C # или Java - средах, где я точно знаю, что вы можете правильно выводить символы Unicode из пути. С инструментами командной строки всегда неясно, особенно из Cygwin.

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

...