Soluzione 1:
Un modo potrebbe essere con sed:
mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')
Sostituisci file
con il tuo nome file, ovviamente. Questo sostituirà tutto ciò che non è una lettera, un numero, un punto, un trattino basso o un trattino con un carattere di sottolineatura. Puoi aggiungere o rimuovere caratteri da mantenere come preferisci e/o cambiare il carattere sostitutivo con qualsiasi altra cosa o niente del tutto.
Soluzione 2:
Presumo che tu sia su una macchina Linux e che i file siano stati creati su una macchina Windows. Linux utilizza UTF-8 come codifica dei caratteri per i nomi dei file, mentre Windows utilizza qualcos'altro. Penso che questa sia la causa del problema.
Userei "convmv". Questo è uno strumento che può convertire i nomi dei file da una codifica di caratteri a un'altra. Per l'Europa occidentale normalmente funziona uno di questi:
convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .
Se devi installarlo su un Linux basato su Debian, puoi farlo eseguendo:
sudo apt-get install convmv
Funziona per me ogni volta e recupera il nome file originale.
Fonte:LeaseWebLabs
Soluzione 3:
Ho recuperato alcuni file giapponesi con nomi di file interrotti da una chiavetta USB rotta e le soluzioni di cui sopra non hanno funzionato per me.
Raccomando il pacchetto detox:
L'utilità di disintossicazione rinomina i file per semplificarne l'utilizzo. Rimuove spazi e altri fastidi simili. Tradurrà o ripulirà anche caratteri Latin-1 (ISO 8859-1) codificati in ASCII a 8 bit, caratteri Unicode codificati in UTF-8 e caratteri con escape CGI.
Esempio di utilizzo:
detox -r -v /path/to/your/files
-r Recurse into subdirectories -v Be verbose about which files are being renamed -n Can be used for a dry run (only show what would be changed)
Soluzione 4:
Presumo tu voglia dire che vuoi attraversare il filesystem e correggere tutti questi file?
Ecco come lo farei
find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
print("Renaming $_ to $new\n"); rename($_, $new);
}'
Ciò troverebbe tutti i file con caratteri non ascii e li sostituirebbe con caratteri di sottolineatura (_
). Fai attenzione però, se esiste già un file con il nuovo nome, lo sovrascriverà. Lo script può essere modificato per verificare la presenza di un caso del genere, ma non l'ho inserito per mantenerlo semplice.
Soluzione 5:
Seguendo le risposte su https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters, puoi utilizzare:
rename 's/[^\x00-\x7F]//g' *
dove *
corrisponde ai file che vuoi rinominare. Se vuoi farlo su più directory, puoi fare qualcosa come:
find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;
Puoi usare l'argomento -n per rename
per fare un giro di prova e vedere cosa sarebbe cambiato, senza cambiarlo.