Pregunta

Tengo un montón de archivos con nombres de archivo con nuestra hermosa sueca de las letras å å y ö.Por diversas razones, ahora necesito convertirlos a un [a-zA-Z] rango.Sólo la eliminación de cualquier cosa fuera de este rango es bastante fácil.Lo que me causa problemas es que me gustaría cambiar å con un, ö con o y así sucesivamente.

Este es el conjunto de caracteres de problemas en su peor momento.

Tengo un conjunto de archivos de prueba:

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

Me estoy basando mi script en esta línea, la tubería es de resultados en diversos comandos

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

La cosa extraña es que si puedo imprimir los resultados de este (el llano de bucle que es) en un archivo me sale este resultado:

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

Así que algo extraño está sucediendo a mi los nombres de archivo, incluso antes de que lleguen las otras herramientas (he estado tratando de hacer esto con una sed de puerto para Windows de algo llamado GnuWin32 pero sin suerte hasta el momento) y haciendo que la reemplace en estos personajes no ayuda tampoco.

¿Cómo se podría solucionar este problema?Estoy abierto a cualquier tipo de herramientas, línea de comandos o de lo contrario...

EDITAR: Este es un problema de tiempo, así que estoy buscando un quick 'n feo revisión

¿Fue útil?

Solución

Usted puede utilizar este código (Python)

Cambiar el nombre de los archivos internacionales

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

###

Usted tiene que cambiar su codificación y su char tablas (he probado este script con el español de archivos y funciona bien).Puedes comentar el "movimiento" de la línea para comprobar si está funcionando ok, y quitar el comentario más tarde para hacer el cambio de nombre.

Otros consejos

Usted podría tener más suerte en cmd.exe si lo abre en modo UNICODE.El uso de "cmd /U".

Otros han propuesto el uso de un lenguaje de programación real.Eso está bien, especialmente si usted tiene un lenguaje que es muy cómodo.Mi amigo en el C# equipo dice que C# 3.0 (con Linq) es muy adecuado para batir rápido, pequeños programas como este.Él ha dejado de escribir archivos por lotes, la mayoría del tiempo.

Personalmente, me gustaría elegir PowerShell.Este problema puede ser resuelto a la derecha en la línea de comandos, y en una sola línea.Voy a

EDITAR:no es una línea, pero no es una gran cantidad de código, ya sea.Además, se ve como StackOverflow no le gusta la sintaxis "$_.Nombre", y representa el _ como _.

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

Yo iba a escribir esto en C++, C# o Java -- entornos donde estoy seguro de que usted puede obtener los caracteres Unicode de una ruta de acceso correctamente.Es siempre incierto con herramientas de línea de comandos, sobre todo fuera de Cygwin.

A continuación, el código es un simple buscar/reemplazar o regex/reemplazar.Si usted puede nombrar a un idioma sería fácil escribir el código.

Me gustaría escribir un vbscript (WSH) para explorar los directorios, a continuación, enviar los nombres de archivo a una función que rompe los nombres de los archivos en sus letras individuales, a continuación, hace un SELECT CASE en el de suecia queridos y los reemplaza con los que usted desea.O, en lugar de hacer que la función sólo podía caer es a través de un montón de REEMPLAZAR() funciones, la reasignación de la salida de la cadena de entrada.Al final se cambia el nombre del archivo con el nuevo valor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top