1

素敵なスウェーデン文字åöを使用したファイル名を持つファイルがたくさんあります。さまざまな理由から、これらを [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

そのため、他のツールに到達する前にファイル名に何か奇妙なことが起こっています(GnuWin32と呼ばれるものからWindows用のsedポートを使用してこれを実行しようとしましたが、これまでのところ運がありません)、これらの文字を置き換えてもどちらかを助けます。

この問題をどのように解決しますか?コマンドラインなど、あらゆる種類のツールを受け入れます…</p>

編集:これは 1 回限りの問題なので、簡単で見苦しい修正を探しています。

4

4 に答える 4

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)

###

エンコーディングと文字テーブルを変更する必要があります (このスクリプトをスペイン語のファイルでテストしたところ、問題なく動作しました)。「移動」行にコメントを付けて、正常に機能しているかどうかを確認し、後でコメントを削除して名前を変更することができます。

于 2008-09-11T19:07:28.650 に答える
1

UNICODEモードで開いた場合、cmd.exeでもっとうまくいくかもしれません。「cmd /U」を使用します。

他の人は、実際のプログラミング言語を使用することを提案しています。それは問題ありません。特に、非常に使い慣れた言語を使用している場合はなおさらです。C# チームの友人は、C# 3.0 (Linq を使用) は、このような迅速で小さなプログラムを作成するのに適していると言っています。彼はほとんどの場合、バッチ ファイルの書き込みをやめました。

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

編集: 1 行ではありませんが、多くのコードでもありません。また、StackOverflow は "$_.Name" という構文が気に入らず、_ を _ としてレンダリングするようです。

$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.
}
于 2008-09-11T16:33:33.293 に答える
0

これを C++、C#、または Java で記述します。これらの環境では、パスから Unicode 文字を適切に取得できることが確実にわかっています。特にCygwinの場合、コマンドラインツールでは常に不確実です.

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

于 2008-09-11T15:39:01.693 に答える
0

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

于 2008-09-11T15:42:16.303 に答える