1 votes

Renommage par lots de fichiers avec des caractères internationaux sous Windows XP

J'ai tout un tas de fichiers dont les noms utilisent nos belles lettres suédoises. å å y ö . Pour diverses raisons, je dois maintenant les convertir en une plage [a-zA-Z]. Il est assez facile de supprimer tout ce qui se trouve en dehors de cette plage. Ce qui me pose problème, c'est que je voudrais remplacer å con a , ö con o et ainsi de suite.

C'est le pire des problèmes de jeu de caractères.

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 base mon script sur cette ligne, et j'envoie ses résultats dans diverses commandes.

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

Ce qui est bizarre, c'est que si j'imprime les résultats de cette boucle (c'est-à-dire la simple boucle for) 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

Il se passe donc quelque chose de bizarre avec mes noms de fichiers avant même qu'ils n'atteignent les autres outils (j'ai essayé de faire cela en utilisant un portage sed pour Windows à partir de quelque chose appelé GnuWin32, mais sans succès jusqu'à présent) et faire le remplacement sur ces caractères n'aide pas non plus.

Comment résoudriez-vous ce problème ? Je suis ouvert à tout type d'outil, ligne de commande ou autre

EDIT : C'est un problème ponctuel, je cherche donc une solution rapide et peu esthétique.

1voto

Jay Bazuzi Points 20462

Vous aurez peut-être plus de chance avec cmd.exe si vous l'ouvrez en mode UNICODE. Utilisez "cmd /U".

D'autres ont proposé d'utiliser un véritable langage de programmation. C'est très bien, surtout si vous avez un langage avec lequel vous êtes très à l'aise. Mon ami de l'équipe C# dit que C# 3.0 (avec Linq) est bien adapté à la création rapide de petits programmes comme celui-ci. Il a cessé d'écrire des fichiers batch la plupart du temps.

Personnellement, je choisirais PowerShell. Ce problème peut être résolu directement 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 non plus. De plus, il semble que StackOverflow n'aime pas la syntaxe "$_.Name", et rend le _ comme _.

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

1voto

PabloG Points 9308

Vous pouvez utiliser ce code (Python)

Renommer les fichiers 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 vos tables de caractères (j'ai testé ce script avec des fichiers espagnols et cela fonctionne bien). Vous pouvez commenter la ligne "move" pour vérifier si ça marche bien, et enlever le commentaire plus tard pour faire le renommage.

0voto

Jason Cohen Points 36475

J'écrirais ceci en C++, C# ou Java - des environnements où je suis certain que l'on peut obtenir correctement les caractères Unicode d'un chemin. C'est toujours incertain avec les outils en ligne de commande, surtout avec Cygwin.

Ensuite, le code est un simple rechercher/remplacer ou regex/remplacer. Si vous pouvez nommer un langage, il serait facile d'écrire le code.

0voto

busse Points 320

J'écrirais un vbscript (WSH) pour scanner les répertoires, puis envoyer les noms de fichiers à une fonction qui décompose les noms de fichiers en lettres individuelles, puis fait un SELECT CASE sur les suédois et les remplace par ceux que vous voulez. Ou bien, au lieu de faire cela, la fonction pourrait simplement faire passer les noms de fichiers par un ensemble de fonctions REPLACE(), en réassignant la sortie à la chaîne d'entrée. À la fin, elle renomme le fichier avec la nouvelle valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X