2008-09-11 39 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. 
}