Domanda

Ho un sacco di file con nomi che utilizzano le nostre adorabili lettere svedesi å å E ö.Per vari motivi ora devo convertirli in un intervallo [a-zA-Z].Rimuovere semplicemente qualsiasi cosa al di fuori di questo intervallo è abbastanza semplice.La cosa che mi crea problemi è che vorrei sostituire å con UN, ö con o e così via.

Questo è il peggiore dei problemi di carattere.

Ho una serie di file di test:

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

Sto basando il mio script su questa riga, inserendo i risultati in vari comandi

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

La cosa strana è che se stampo i risultati di questo (il semplice ciclo for) in un file ottengo questo output:

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

Quindi sta succedendo qualcosa di strano ai miei nomi di file prima ancora che raggiungano gli altri strumenti (ho provato a farlo usando una porta sed per Windows da qualcosa chiamato GnuWin32 ma finora senza fortuna) e fare la sostituzione su questi caratteri non funziona aiutare neanche.

Come risolveresti questo problema?Sono aperto a qualsiasi tipo di strumento, riga di comando o altro...

MODIFICARE: Questo è un problema che si verifica una sola volta, quindi sto cercando una soluzione rapida e brutta

È stato utile?

Soluzione

Puoi usare questo codice (Python)

Rinominare i file internazionali

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

###

Devi modificare la codifica e le tabelle dei caratteri (ho testato questo script con file spagnoli e funziona bene).Puoi commentare la riga "sposta" per verificare se funziona correttamente e rimuovere il commento in seguito per rinominare.

Altri suggerimenti

Potresti avere più fortuna con cmd.exe se lo apri in modalità UNICODE.Usa "cmd /U".

Altri hanno proposto di utilizzare un vero linguaggio di programmazione.Va bene, soprattutto se parli una lingua con cui ti trovi molto a tuo agio.Il mio amico del team C# dice che C# 3.0 (con Linq) è adatto per creare piccoli programmi veloci come questo.Ha smesso di scrivere file batch per la maggior parte del tempo.

Personalmente sceglierei PowerShell.Questo problema può essere risolto direttamente dalla riga di comando e in un'unica riga.Malato

MODIFICARE:non è una riga, ma non è nemmeno molto codice.Inoltre, sembra che a StackOverflow non piaccia la sintassi "$_.Name" e rende _ come &#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.
}

Lo scriverei in C++, C# o Java, ambienti in cui so per certo che puoi estrarre correttamente i caratteri Unicode da un percorso.È sempre incerto con gli strumenti da riga di comando, soprattutto con Cygwin.

Quindi il codice è un semplice trova/sostituisci o regex/sostituisci.Se potessi nominare una lingua sarebbe facile scrivere il codice.

Scriverei un vbscript (WSH) per scansionare le directory, quindi invierei i nomi dei file a una funzione che suddivide i nomi dei file nelle loro singole lettere, quindi esegue un SELECT CASE su quelli svedesi e li sostituisce con quelli desiderati.Oppure, invece di farlo, la funzione potrebbe semplicemente rilasciarlo attraverso una serie di funzioni REPLACE(), riassegnando l'output alla stringa di input.Alla fine rinomina il file con il nuovo valore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top