2008-09-11 6 views
1

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

Это проблемы с чередом в худшем случае.

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

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) 

странно Дело в том, что если я печатаю результаты этого (равнина для цикла, который является) в файл я получаю этот выход:

files\Copy of New Text Documen †„” t.txt 
files\fofo.txt 
files\New Text Document.txt 
files\worstcase †„”Ž™‚.txt 

Так что-то Wierd происходит с моими именами файлов до того, как они дойдут до других инструментов (я пытался это сделать, используя sed-порт для Windows от чего-то, называемого GnuWin32, но пока не повезло), и делать замену на этих символах тоже не помогает.

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

EDIT: Это проблема один раз, так что я ищу для быстрого н уродливой исправить

ответ

1

Вы можете использовать этот код (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», чтобы проверить, работает ли она нормально, и удалите комментарий позже, чтобы выполнить переименование.

0

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

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

0

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

1

Возможно, вам больше повезло в cmd.exe, если вы открыли его в режиме UNICODE. Используйте «cmd/U».

Другие предложили использовать настоящий язык программирования. Это нормально, особенно если у вас есть язык, с которым вам очень удобно. Мой друг в команде C# говорит, что C# 3.0 (с Linq) хорошо подходит для взлома быстрых небольших программ, подобных этому. Большую часть времени он прекратил писать пакетные файлы.

Лично я бы выбрал PowerShell. Эта проблема может быть решена прямо в командной строке и в одной строке. Я буду

EDIT: это не одна строка, но это не очень много кода. Кроме того, похоже, что StackOverflow не нравится синтаксис «$ _.Название», и делает _, как & # 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. 
}