Rimuove in modo ricorsivo tutti i caratteri non validi dai file di testo in posizione

0

Ho diverse migliaia di file di testo, alcuni dei quali contengono caratteri UTF-8 non validi. Voglio rimuovere in modo ricorsivo tutti i caratteri non validi da questi file al loro posto.

Sono consapevole che molte domande simili sono state poste prima, come ad esempio: come rimuovere caratteri non UTF-8 dal file di testo , ma non ne ho trovato uno che sia ricorsivo e funzioni sul posto.

    
posta pingu 09.04.2016 - 00:01
fonte

2 risposte

3

Il bello dei comandi UNIX è che puoi combinarli insieme. iconv non sa come recurse nelle directory, ma find fa. Può chiamare iconv su ogni file che vede.

(Questi comandi convertiranno tutti i file nella directory corrente e le directory tutte all'interno. Assicurati di essere nella directory in cui desideri convertire tutti i file in modo ricorsivo.)

Per cambiare tutti i file con l'estensione .txt :

find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'
find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'
find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'
find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'%pre%' filename; do 
        iconv -f utf-8 -t utf-8 -c "$filename" | sponge "$filename"
    done
' filename; do iconv -f utf-8 -t utf-8 -c "$filename" > "$filename".iconv_cleaned_utf8 mv "$filename".iconv_cleaned_utf8 "$filename" done
' filename; do iconv -f utf-8 -t utf-8 -c "$filename" | sponge "$filename" done
' filename; do iconv -f utf-8 -t utf-8 -c "$filename" > "$filename".iconv_cleaned_utf8 mv "$filename".iconv_cleaned_utf8 "$filename" done

Suppongo che questo codice richieda qualche spiegazione. Quello che fa è:

  • find stampa tutti i nomi file dei file coinvolti, separati da un byte null (il byte null è l'unico carattere non valido per un percorso file)
  • bash read s i nomi dei file e i loop che li attraversano
  • iconv converte il file in un file temporaneo con un'estensione aggiuntiva
  • abbiamo mv del tempfile per sostituire il file originale.

Se hanno estensioni diverse (questo è per tutti i file sotto la directory corrente), rimuovi il -name *.txt

È un po 'più pulito se hai l'utilità sponge da moreutils , ma non è installato per impostazione predefinita.

%pre%     
risposta data 09.04.2016 - 05:04
fonte
0

Questo potrebbe non rispondere all'intera domanda ma sono stato un utente felice di BBEdit per un certo numero di anni (Pre-OSX almeno ...). Lo uso per l'hacking HTML e l'apertura occasionale di file che non riesco a capire.

Ha questa bella funzione chiamata Zap Gremlins, che in pratica rimuove un sacco di caratteri strani e non ASCII da qualsiasi file. Sembra molto simile a quello che devi fare.

E è massicciabile, ma non gratuito. Potrebbe essere vale la pena investigare per vedere se farà ciò che desideri.

    
risposta data 09.04.2016 - 01:11
fonte

Leggi altre domande sui tag