GNU/Linux >> Linux Esercitazione >  >> Linux

Come rimuovere i caratteri non validi dai nomi dei file?

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.


Linux
  1. Come disinstallare aria2 da Ubuntu

  2. Come rimuovere le linee che appaiono sul file B da un altro file A?

  3. Rimuovi gli spazi bianchi dai nomi dei file in Linux

  4. Come rimuovere iso 9660 da USB?

  5. Come rinominare in blocco i file con codifica non valida o sostituire in blocco i caratteri codificati non validi?

Come rimuovere un comando dalla cronologia in Linux

Come rimuovere (^M) caratteri da un file in Linux

Come rimuovere gli spazi dai nomi dei file in Linux

Come rimuovere tutti i caratteri di spazio bianco da un file di testo

Come rimuovere Swap Space da Centos 7.x?

Come faccio a rimuovere i file di zona dal mio server?