2008-09-11 17 views
1

私たちの素敵なスウェーデンの手紙åAのöを使用してファイル名を持つファイルの全体の束を持っています。 さまざまな理由から、これらを[a-zA-Z]の範囲に変換する必要があります。この範囲外のものを削除するだけです。私のトラブルを引き起こしている事は、私がとö 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) 

奇妙なことは、私は印刷する場合ということですこの結果(ファイルのプレーンループ)は次のようになります。

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

だから何かwierd他のツールに到達する前に私のファイル名に起こっています(これはWindows用のsedポートを使ってGnuWin32と呼ばれていましたが、これまで何も手伝っていませんでした)。

どのようにこの問題を解決しますか?私は...それ以外のツール、コマンドラインまたは任意の型に開いている

EDIT:これは、1時間の問題であるので、私は私がこれを書くと

答えて

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

迅速「N醜い修正を探していますC++、C#、またはJava環境では、Unicode文字を適切にパスから取得できることがわかっています。コマンドラインツール、特にCygwinからは、常に不確かです。

次に、コードは単純な検索/置換または正規表現/置換です。言語に名前を付けることができれば、コードを書くのは簡単です。

0

ディレクトリをスキャンするためにvbscript(WSH)を書いて、ファイル名を個々の文字に分割してスウェーデン語のSELECT CASEを実行し、それらを1つのものに置き換える関数にファイル名を送信したいあなたは欲しい。または、その代わりに、関数は一連のREPLACE()関数を介して関数を削除し、出力を入力文字列に再割り当てすることができます。最後に、新しい値でファイルの名前を変更します。

1

UNICODEモードで開いた場合、cmd.exeにもっと幸運があるかもしれません。 "cmd/U"を使用してください。

他は、実際のプログラミング言語を使用して提案しています。それはうれしいことです。特に、あなたが非常に快適な言語を持っているならば。私のC#チームの友人は、C#3.0(Linqを使って)は、このような素早く小さなプログラムを整理するのに適していると言います。彼はほとんどの時間バッチファイルを書き留めていません。

個人的には、PowerShellを選択します。この問題は、コマンドラインと1行で解決できます。私は

EDIT:それは1行ではありませんが、多くのコードでもありません。また、それは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. 
}