Même fichier, nom de fichier différent en raison d'un problème d'encodage?

9

J'étais sur le point de différencier une sauvegarde de sa source pour vérifier manuellement que les données sont correctes. Certains caractères, comme åäö, n'apparaissent pas correctement sur les données d'origine, mais comme les clients (via samba) l'interprètent correctement, il n'y a rien à craindre. Les données restaurées à partir de la sauvegarde affichent correctement les caractères, ce qui conduit les diff à ne pas les considérer comme les mêmes fichiers (avec les fichiers diff, mais plutôt complètement différents).

sommes md5, même fichier mais nom différent.

# 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

Options de montage et systèmes de fichiers

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

Lieu

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
user135361
la source
Sd [bc] 1 a-t-il été rempli sur la même machine? C'est-à-dire, avec la même option de montage et les mêmes paramètres régionaux?
tink
Non, bon endroit. Je l'ai cependant retiré de la sauvegarde sur la même machine tout à l'heure, et le problème persiste. Voir la sortie de 'od' ajoutée dans l'édition.
user135361

Réponses:

6

Les systèmes de fichiers Unix ont tendance à être indépendants des paramètres régionaux dans le sens où les noms de fichiers se composent d'octets et c'est à l'application de décider ce que ces octets signifient s'ils tombent en dehors de la plage ASCII. La convention sur Unix aujourd'hui consiste à coder les noms de fichiers et tout le reste en UTF-8, à l'exception de certains environnements hérités (principalement asiatiques). Les systèmes de fichiers Windows, en revanche, ont tendance à avoir un codage spécifié dans les propriétés du système de fichiers.

Si vous devez travailler avec des noms de fichiers dans un encodage différent, créez une vue traduite de ce système de fichiers avec convmvfs . Voir travailler avec des noms de fichiers dans un encodage différent sur ssh

Il semble que votre système d'origine ait des noms de fichiers encodés en latin-1. Votre système actuel utilise UTF-8, et la séquence d'un octet représentant åen latin-1 ( \345) est une séquence non valide en UTF-8 qui lss'imprime comme ?. Votre processus de sauvegarde a en quelque sorte abouti à des noms de fichiers encodés en UTF-8. Samba traduit les noms de fichiers en fonction de sa configuration.

Pour accéder aux fichiers originaux avec votre encodage natif, faites une vue recodée:

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

(Vous devrez peut-être d'autres options selon les autorisations et la propriété que vous souhaitez obtenir.)

Gilles 'SO- arrête d'être méchant'
la source
Merci pour l'explication de son fonctionnement. Vous n'êtes pas sûr que cela m'aide vraiment, vous me dites que j'ai (probablement) des systèmes de fichiers qui ont des encodages différents, et donc j'ai besoin de créer une vue traduite de .. etc?
user135361
@ user135361 Vous avez des ensembles de données dont les noms de fichiers ont des encodages différents. J'ai développé ma réponse.
Gilles 'SO- arrête d'être méchant'
Cela a vraiment fait l'affaire. Merci beaucoup pour votre perspicacité.
user135361
1

Sous Unix / Linux, un nom de fichier peut contenir n'importe quel caractère sauf '\0'(ASCII NUL) et '/'(barre oblique, séparateur de répertoire). En particulier, si vous souhaitez donner à vos fichiers des noms en kanji dans un codage étrange, allez-y. Vous ne verrez probablement que du charabia ls(1)ou d'autres commandes, mais rien de mauvais ne se produira. C'est ce que vous voyez, le rendu est le suivant p?, '?'voici un raccourci commun pour "caractère inconnu / non ASCII".

Essayez d'exécuter les deux noms de fichiers od -c, c'est-à-dire de faire quelque chose comme:

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

(le glob est de filtrer les noms non pertinents, d'ajuster au goût).

Ce n'est que si la sortie diffère que je commencerai à m'inquiéter. Mais étant donné votre configuration Svedish, je soupçonne que le nom correct est . Peut-être que l'autre est un nom en latin-4 restant d'une configuration précédente?

vonbrand
la source
Bien que ce ne soit pas une solution, je pense que vous fournissez une explication précieuse de son fonctionnement. De plus, je ne connaissais pas «od», édité pour fournir une sortie od.
user135361