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%