Pergunta

Eu tenho um monte de arquivos com nomes usando nossas lindas letras suecas å å e ö.Por vários motivos, agora preciso convertê-los para um intervalo [a-zA-Z].Remover qualquer coisa fora desse intervalo é bastante fácil.O que está me causando problemas é que eu gostaria de substituir å com a, ö com ó e assim por diante.

Este é o pior dos problemas do charset.

Eu tenho um conjunto de arquivos de teste:

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

Estou baseando meu script nesta linha, canalizando seus resultados em vários comandos

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

O mais estranho é que se eu imprimir os resultados disso (o loop for simples) em um arquivo, recebo esta saída:

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

Então, algo estranho está acontecendo com meus nomes de arquivos antes mesmo de chegarem às outras ferramentas (tenho tentado fazer isso usando uma porta sed para Windows de algo chamado GnuWin32, mas sem sorte até agora) e fazer a substituição desses caracteres não ajudar também.

Como resolveria este problema?Estou aberto a qualquer tipo de ferramenta, linha de comando ou outra…

EDITAR: Este é um problema único, então estou procurando uma solução rápida e feia

Foi útil?

Solução

Você pode usar este código (Python)

Renomear arquivos internacionais

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

###

Você precisa alterar sua codificação e suas tabelas de caracteres (testei esse script com arquivos em espanhol e funciona bem).Você pode comentar a linha "mover" para verificar se está funcionando bem e remover o comentário posteriormente para renomear.

Outras dicas

Você pode ter mais sorte no cmd.exe se abri-lo no modo UNICODE.Use "cmd/U".

Outros propuseram o uso de uma linguagem de programação real.Tudo bem, especialmente se você tiver um idioma com o qual se sinta confortável.Meu amigo da equipe C# diz que o C# 3.0 (com Linq) é adequado para criar programas pequenos e rápidos como este.Ele parou de gravar arquivos em lote na maioria das vezes.

Pessoalmente, eu escolheria o PowerShell.Este problema pode ser resolvido diretamente na linha de comando e em uma única linha.Doente

EDITAR:não é uma linha, mas também não é muito código.Além disso, parece que StackOverflow não gosta da sintaxe "$_.Name" e renderiza _ como &#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.
}

Eu escreveria isso em C++, C# ou Java - ambientes onde tenho certeza de que você pode obter os caracteres Unicode de um caminho corretamente.É sempre incerto com ferramentas de linha de comando, especialmente no Cygwin.

Então o código é uma simples localização/substituição ou regex/substituição.Se você puder nomear um idioma, será fácil escrever o código.

Eu escreveria um vbscript (WSH) para verificar os diretórios, depois enviaria os nomes dos arquivos para uma função que divide os nomes dos arquivos em letras individuais, depois fazia um SELECT CASE nos suecos e os substituía pelos que você deseja.Ou, em vez de fazer isso, a função poderia simplesmente descartá-la através de várias funções REPLACE(), reatribuindo a saída à string de entrada.No final, ele renomeia o arquivo com o novo valor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top