Question

J'ai tout un tas de fichiers avec des noms de fichiers à l'aide de notre belle suédoise lettres å å et ö.Pour diverses raisons, j'ai maintenant besoin de les convertir à un [a-zA-Z] gamme.Juste de retirer quelque chose en dehors de cette plage est assez facile.La chose qui me causer problème est que j'aimerais remplacer å avec un, ö avec o et ainsi de suite.

C'est le charset de troubles à leur pire.

J'ai un ensemble de fichiers de test:

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

Je suis en basant mon script sur cette ligne, la tuyauterie, les résultats dans les diverses commandes

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

Le bizarre c'est que si je imprimer les résultats de cette (la plaine de la boucle qui est) dans un fichier j'obtiens ce résultat:

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

Donc, quelque chose de bizarre se passe pour mes noms de fichiers avant qu'ils n'atteignent même les autres outils (j'ai essayé de le faire à l'aide d'un sed port pour Windows à partir de quelque chose qui s'appelle GnuWin32 mais pas de chance jusqu'à présent) et en faisant de la remplacer sur ces personnages n'aide pas non plus.

Comment voulez-vous résoudre ce problème?Je suis ouvert à tout type d'outils en ligne de commande ou autre...

EDIT: C'est un problème de temps, donc je suis à la recherche d'un quick 'n moche fix

Était-ce utile?

La solution

Vous pouvez utiliser ce code (Python)

Renommer des dossiers internationaux

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

###

Vous devez changer votre encodage et de votre char tables (je l'ai testé ce script avec l'espagnol des fichiers et fonctionne très bien).Vous pouvez commenter le "move" de la ligne afin de vérifier si ça fonctionne ok, et supprimez le commentaire plus tard pour faire le changement de nom.

Autres conseils

Vous pourriez avoir plus de chance dans cmd.exe si vous l'avez ouvert en mode UNICODE.Utiliser "cmd /U".

D'autres ont proposé l'utilisation d'un vrai langage de programmation.C'est très bien, surtout si vous avez une langue, vous êtes très à l'aise avec.Mon ami sur le C# équipe dit que C# 3.0 (avec Linq) est bien adapté à des coups de fouet rapide, des petits programmes de ce genre.Il a cessé d'écrire des fichiers batch, la plupart du temps.

Personnellement, j'ai choisi de PowerShell.Ce problème peut être résolu sur la ligne de commande, et en une seule ligne.Je vais

EDIT:ce n'est pas une ligne, mais ce n'est pas beaucoup de code, soit.Aussi, il ressemble StackOverflow n'aime pas la syntaxe "$_.Name", et rend le _ par _.

$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.
}

Je voudrais écrire dans C++, C# ou Java -- les environnements où je sais que pour certain que vous pouvez obtenir les caractères Unicode d'un chemin d'accès correctement.Il est toujours incertain avec des outils de ligne de commande, en particulier de Cygwin.

Ensuite, le code est un simple rechercher/remplacer ou regex/remplacer.Si vous pouvez vous le nom d'une langue, il serait facile d'écrire du code.

Je voudrais écrire un script vbscript (WSH) pour scanner les répertoires, puis envoyer les noms de fichiers à une fonction qui permet de diviser les noms de fichiers dans leurs lettres, puis fait un SELECT sur les suédois et les remplace par celles que vous voulez.Ou, au lieu de faire que la fonction pourrait simplement laisser tomber à travers un tas de REPLACE() les fonctions de, réaffectation des la sortie de la chaîne d'entrée.À la fin, il renomme le fichier avec la nouvelle valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top