Stesso file, nome file diverso a causa di problemi di codifica?


9

Stavo per diffondere un backup dalla sua fonte per verificare manualmente che i dati fossero corretti. Alcuni caratteri, come åäö, non sono mostrati correttamente sui dati originali, ma poiché i client (oltre samba) lo interpretano correttamente non è nulla di cui preoccuparsi. I dati ripristinati dal backup mostrano i caratteri correttamente, portando diff a non considerarli come gli stessi file (con diff, ma piuttosto file completamente diversi).

somme md5, stesso file ma nome diverso.

# md5sum /original/iStock_000003637083Large-barn*
e37c34968dd145a0e25692e1cb7fbdb1  /original/iStock_000003637083Large-barn p? strand.jpg

# md5sum /frombackup/iStock_000003637083Large-barn*
e37c34968dd145a0e25692e1cb7fbdb1  /frombackup/iStock_000003637083Large-barn på strand.jpg

Montare opzioni e filesystem

/dev/sdb1 on /original type ext4 (rw,noatime,errors=remount-ro)
/dev/sdc1 on /frombackup type ext4 (rw)

località

LANG=sv_SE.UTF-8
LANGUAGE=
LC_CTYPE="sv_SE.UTF-8"
LC_NUMERIC="sv_SE.UTF-8"
LC_TIME="sv_SE.UTF-8"
LC_COLLATE="sv_SE.UTF-8"
LC_MONETARY="sv_SE.UTF-8"
LC_MESSAGES="sv_SE.UTF-8"
LC_PAPER="sv_SE.UTF-8"
LC_NAME="sv_SE.UTF-8"
LC_ADDRESS="sv_SE.UTF-8"
LC_TELEPHONE="sv_SE.UTF-8"
LC_MEASUREMENT="sv_SE.UTF-8"
LC_IDENTIFICATION="sv_SE.UTF-8"
LC_ALL=

od -c

# ls "/original/iStock_000003637083Large-barn p� strand.jpg" | od -c
0000000   /   v   a   r   /   w   w   w   /   m   e   d   i   a   b   a
0000020   n   k   e   n   _   i   m   a   g   e   s   /   k   u   n   d
0000040   i   d   8   0   /   _   B   a   r   n   /   i   S   t   o   c
0000060   k   _   0   0   0   0   0   3   6   3   7   0   8   3   L   a
0000100   r   g   e   -   b   a   r   n       p 345       s   t   r   a
0000120   n   d   .   j   p   g  \n
0000127


# ls "/frombackup/iStock_000003637083Large-barn på strand.jpg" | od -c
0000000   /   d   a   t   a   /   v   a   r   /   w   w   w   /   m   e
0000020   d   i   a   b   a   n   k   e   n   _   i   m   a   g   e   s
0000040   /   k   u   n   d   i   d   8   0   /   _   B   a   r   n   /
0000060   i   S   t   o   c   k   _   0   0   0   0   0   3   6   3   7
0000100   0   8   3   L   a   r   g   e   -   b   a   r   n       p 303
0000120 245       s   t   r   a   n   d   .   j   p   g  \n
0000135

Sd [bc] 1 è stato popolato sulla stessa macchina? Vale a dire, con le stesse opzioni di montaggio e impostazioni locali?
tink

No, buon posto. Tuttavia, l'ho appena estratto dal backup sulla stessa macchina e il problema persiste. Vedi l'output di 'od' aggiunto nella modifica.
user135361

Risposte:


6

I filesystem Unix tendono ad essere indipendenti dalla locale, nel senso che i nomi dei file sono costituiti da byte ed è compito dell'applicazione decidere cosa significano quei byte se non rientrano nell'intervallo ASCII. La convenzione su unix oggi è di codificare i nomi dei file e tutto il resto in UTF-8, ad eccezione di alcuni ambienti legacy (principalmente asiatici). I filesystem di Windows, d'altra parte, tendono ad avere una codifica specificata nelle proprietà del filesystem.

Se devi lavorare con nomi di file con una codifica diversa, crea una vista tradotta di quel file system con convmvfs . Guarda come lavorare con i nomi di file con una codifica diversa su ssh

Sembra che il tuo sistema originale abbia nomi di file codificati in latino-1. Il sistema corrente utilizza UTF-8 e la sequenza di un byte che rappresenta åin latino-1 ( \345) è una sequenza non valida in UTF-8 che lsstampa come ?. Il tuo processo di backup ha in qualche modo portato nomi di file codificati in UTF-8. Samba traduce i nomi dei file in base alla sua configurazione.

Per accedere ai file originali con la tua codifica nativa, crea una vista ricodificata:

mkdir /original-recoded
convmvfs -o icharset=LATIN1,ocharset=UTF8 /original /original-recoded
diff -r /original-recoded /frombackup

(Potrebbero essere necessarie altre opzioni a seconda delle autorizzazioni e della proprietà che si desidera ottenere.)


Grazie per la spiegazione di come funziona. Non sono sicuro che questo mi stia davvero aiutando, mi stai dicendo che (probabilmente) ho filesystem con codifiche diverse, e quindi ho bisogno di creare una vista tradotta di ... ecc.?
user135361

@ user135361 Hai set di dati in cui i nomi dei file hanno codifiche diverse. Ho ampliato la mia risposta.
Gilles 'SO- smetti di essere malvagio'

Questo ha davvero funzionato. Grazie mille per la tua comprensione.
user135361

1

In Unix / Linux, un nome file può contenere qualsiasi carattere tranne '\0'(ASCII NUL) e '/'(barra, separatore di directory). In particolare, se vuoi dare i nomi dei tuoi file in Kanji in una strana codifica, vai avanti. Probabilmente vedrai solo incomprensibili ls(1)o altri comandi, ma non accadrà nulla di brutto. Questo è ciò che stai vedendo, è reso come p?, '?'qui è una scorciatoia comune per "carattere sconosciuto / non ASCII".

Prova a eseguire entrambi i nomi dei file od -c, ovvero fai qualcosa del tipo:

ls /the/dir/offending/fi* | od -c

(il glob è quello di filtrare i nomi non rilevanti, adattarlo a piacere).

Solo se l'uscita fosse diversa, avrei iniziato a preoccuparmi. Ma data la tua configurazione Svedish, sospetto che sia il nome corretto . Forse l'altro è un nome in latino-4 rimasto di una configurazione precedente?


Sebbene non sia una soluzione, penso che tu fornisca una preziosa spiegazione di come funziona. Inoltre, non sapevo di "od", modificato per fornire un output.
user135361
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.