BSD – Rimuovere i caratteri non ascii da tutti i file in una directory in modo ricorsivo

Sto cercando di migrare un gruppo (300GB +) di file da un'unità FAT32 al mio filesystem freeNas ZFS ma each command che lo butto (tar, pax, mv, cp) lancia un 'argomento non valido' quando incontra un non- ASCII nome file – è solitamente qualcosa che è stato creato in Windows e legge qualcosa secondo le righe di "foo? S bar.mp3 …" where il? potrebbe essere stato un apostrofo o un tale.

Può chiunque aiutare con alcune righe di codice per ricorsivamente passare attraverso la struttura di directory e rinominare i file per rimuovere i caratteri offensivi.

Molto apprezzato.

5 Solutions collect form web for “BSD – Rimuovere i caratteri non ascii da tutti i file in una directory in modo ricorsivo”

Prova a montare il filesystem con l'opzione iocharset impostata sulla codifica che utilizza.

Dal man mount sotto la sezione "Opzioni di assembly per grasso":

  iocharset=value Character set to use for converting between 8 bit characters and 16 bit Unicode characters. The default is iso8859-1. Long file‐ names are stored on disk in Unicode format. 

Vedere anche la sezione "Opzioni di assembly per vfat":

  uni_xlate Translate unhandled Unicode characters to special escaped sequences. This lets you backup and restore filenames that are created with any Unicode characters. Without this option, a '?' is used when no translation is possible. The escape character is ':' because it is otherwise illegal on the vfat filesystem. The escape sequence that gets used, where u is the unicode charac‐ ter, is: ':', (u & 0x3f), ((u>>6) & 0x3f), (u>>12). 

e

  utf8 UTF8 is the filesystem safe 8-bit encoding of Unicode that is used by the console. It can be be enabled for the filesystem with this option or disabled with utf8=0, utf8=no or utf8=false. If `uni_xlate' gets set, UTF8 gets disabled. 

Edit:

Mi dispiace, che era Linux, questo è per BSD ( man mount_msdosfs :

  -L locale Specify locale name used for file name conversions for DOS and Win'95 names. By default ISO 8859-1 assumed as local character set. -D DOS_codepage Specify the MS-DOS code page (aka IBM/OEM code page) name used for file name conversions for DOS names. 

Rinomina può farlo.

provare qualcosa di simile

 find dir -depth -exec rename -n 's/[^[:ascii:]]/_/g' {} \; | cat -v 

potrebbe essere necessario che il gatto -v visualizzi correttamente qualsiasi carattere strano senza che il vostro terminal venga avvitato.

se si printingno le sostituzioni accettabili, cambiare -n in -v.

Detto questo, sembra che il charset sul tuo filesystem sia errato (mount -o utf8?), Dato che questo tipo di cose dovrebbe funzionare veramente …

Questo è un modo corretto per applicare ricorsivamente:

 find . -depth -execdir rename 'y/[\:\;\>\<\@\$\#\&\(\)\?\\\%\ ]/_/' {} \; 

modificare tutti questi simboli per il sottolineatura. Fare attenzione, sta considerando tutti gli spazi bianchi.

perché funziona? prendere questo test:

 mkdir test cd test mkdir -pa$/b$/c$/d$ f%/g%/h%/i% j%/k%/l%/m% find . -depth -execdir rename 'y/[\:\;\>\<\@\$\#\&\(\)\?\\\%\ ]/_/' {} \; ls -R 

(come puoi vedere, tutti i file sono stati modificati)

Utilizzare convmv per convertire i nomi di file se sono davvero codificati in modo errato. È preferibile installare il file system con la codifica corretta in primo luogo.

Sostituzione per sottolineatura:

 find . | perl -ane '{ if(m/[[:^ascii:]]/) { print } }' | rename -n 's/[^[:ascii:]]/_/g' 
Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.