Frage

Ich habe eine ganze Reihe von Dateien mit Dateinamen mit unseren schönen schwedischen Buchstaben å å und ö.Aus verschiedenen Gründen, die ich jetzt konvertieren müssen diese zu einem [a-zA-Z] Palette.Nur das entfernen alles, was außerhalb dieses Bereichs ist ziemlich einfach.Das Ding verursacht mir Probleme ist, dass ich möchte, um zu ersetzen å mit ein, ö mit o und so weiter.

Dies ist charset Beschwerden am schlimmsten.

Ich habe eine Reihe von test-Dateien:

files\Copy of New Text Documen åäö t.txt
files\fofo.txt
files\New Text Document.txt
files\worstcase åäöÅÄÖéÉ.txt

Ich bin stützend mein Skript auf dieser Linie, Rohrleitungen es, die Ergebnisse in verschiedenen Befehle

for %%X in (files\*.txt) do (echo %%X) 

Die seltsame Sache ist, dass, wenn ich drucken die Ergebnisse dieser (der einfachen for-Schleife ist) in eine Datei bekomme ich diese Ausgabe:

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

So etwas komisch ist Los, um meine Dateinamen, bevor Sie die anderen tools (ich habe versucht, dies mithilfe einer sed-port für Windows von etwas namens GnuWin32 aber kein Glück so weit) und das zu tun, ersetzen Sie Sie auf diese Zeichen nicht helfen, entweder.

Wie würden Sie dieses problem lösen?Ich bin offen für jede Art von tools, Kommandozeile oder sonst...

EDIT: Dies ist ein ein problem, also ich bin auf der Suche nach einem quick 'n hässlich fix

War es hilfreich?

Lösung

Sie können diesen Code verwenden (Python)

Umbenennen internationale Dateien

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

###

Sie haben Ihre Codierung und Ihre char Tabellen (I dieses Skript mit dem spanischen Dateien getestet und funktioniert) zu ändern. Sie können die „move“ -Linie Kommentar zu überprüfen, ob es funktioniert ok, und entfernen Sie den Kommentar später die Umbenennung zu tun.

Andere Tipps

Sie werden vielleicht mehr Glück in cmd.exe, wenn Sie es in UNICODE-Modus geöffnet. Verwenden Sie "cmd / U".

Andere haben mit einer echten Programmiersprache vorgeschlagen. Das ist in Ordnung, vor allem wenn Sie eine Sprache haben Sie mit sehr bequem sind. Mein Freund auf dem C # Team sagt, dass C # 3.0 (mit Linq) ist gut geeignet, um Schüren schnellen, kleine Programme wie diese. Er hat die meiste Zeit zu schreiben Batch-Dateien gestoppt.

Ich persönlich würde Powershell wählen. Dieses Problem kann direkt auf der Kommandozeile gelöst werden, und in einer einzigen Zeile. Ich werde

EDIT: es ist nicht eine Zeile, aber es ist nicht viel Code, auch nicht. Außerdem sieht es aus wie Stackoverflow nicht die Syntax mag „$ _. Name“ und macht die _ als & # 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.
}

Ich würde schreibe dies in C ++, C # oder Java - Umgebungen, in denen ich sicher wissen, dass Sie die Unicode-Zeichen aus einem Pfad richtig zu bekommen. Es ist immer unsicher mit Kommandozeilen-Tool, vor allem aus Cygwin.

Dann wird der Code ist ein einfaches Suchen / Ersetzen oder regex / ersetzen. Wenn Sie eine Sprache nennen können, es wäre einfach, den Code zu schreiben.

würde ich eine vbscript (WSH) schreiben, um die Verzeichnisse zu scannen, dann die Dateinamen auf eine Funktion senden, die die Dateinamen in ihre einzelnen Buchstaben aufbricht, dann tut eine SELECT-CASE auf den schwedischen Einsen und ersetzt sie durch die, die Sie wollen. Oder anstatt das zu tun, dass die Funktion nur um es durch einen Haufen fallen könnte von REPLACE () Funktionen, die Neuzuweisung der Ausgabe an die Eingabezeichenfolge. Am Ende benennt sie dann die Datei mit dem neuen Wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top