2008-09-11 61 views
1

我有一大堆使用我们可爱的瑞典字母的文件名的文件ö。 由于各种原因,我现在需要将它们转换为[a-zA-Z]范围。只是删除这个范围以外的任何东西都相当容易这是造成我的麻烦的事情是,我想用一个更换öØ等。在Windows XP上使用国际字符批量重命名文件

这是最糟糕的charset问题。

我有一组的测试文件:

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 

因此,一些奇怪的东西正在发生在我的文件名之前,他们甚至到达其他工具(我一直在尝试使用一个名为GnuWin32的Windows的sed端口来做到这一点,但目前还没有运气),并且对这些字符进行替换也没有帮助。

你会如何解决这个问题?我欢迎任何类型的工具,命令行或以其他方式...

编辑:这是一个时间的问题,所以我在寻找一个快速“东经丑陋修复

回答

1

您可以使用此代码(蟒蛇)

重命名的国际文件

# -*- 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) 

### 

你必须改变你的编码和您的焦表格(我用西班牙语文件测试了这个脚本并且工作正常),你可以评论“移动”行来检查它是否正常工作,并且稍后删除注释以进行重命名。

0

我在写这篇文章C++,C#或Java - 的环境中,我确信您可以正确地获取Unicode字符。命令行工具总是不确定,尤其是Cygwin。

然后代码是一个简单的查找/替换或正则表达式/替换。如果你可以命名一种语言,编写代码会很容易。

0

我会写一个vbscript(WSH)来扫描目录,然后将文件名发送到一个函数,将文件名分解为它们各自的字母,然后在瑞典语文件中做一个SELECT CASE并用它们替换它们你要。或者,不是这样做,函数可以通过一堆REPLACE()函数删除它,将输出重新分配给输入字符串。最后,它会使用新值重命名该文件。

1

如果以UNICODE模式打开cmd.exe,可能会有更多运气。使用“cmd/U”。

其他人提出使用真正的编程语言。这很好,特别是如果你有一种你很熟悉的语言。我在C#团队的朋友说,C#3.0(与Linq)非常适合像这样快速的小程序。他大部分时间都不再写批处理文件。

个人而言,我会选择PowerShell。这个问题可以在命令行上单独解决。我会

编辑:它不是一行,但它不是很多代码。此外,它看起来像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. 
}