O mesmo arquivo, nome diferente devido ao problema de codificação?

8

Eu estava prestes a diferenciar um backup da fonte para verificar manualmente se os dados estão corretos. Alguns chars, como åäö, não são mostrados corretamente nos dados originais, mas como os clientes (sobre o samba) interpretam corretamente, não é nada para se preocupar. Os dados restaurados do backup mostram os caracteres corretamente, levando o diff a não considerá-los como os mesmos arquivos (com diffs, mas arquivos completamente diferentes).

md5 somas, mesmo arquivo mas nome diferente.

# 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

Montar opções e sistemas de arquivos

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

Local

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
    
por user135361 07.03.2013 / 20:22

2 respostas

4

Sistemas de arquivos Unix tendem a ser agudos no idioma, no sentido de que os nomes de arquivos consistem em bytes e é o negócio do aplicativo decidir o que esses bytes significam se ficarem fora do intervalo ASCII. A convenção no unix hoje é codificar nomes de arquivos e tudo mais em UTF-8, além de alguns ambientes legados (principalmente asiáticos). Os sistemas de arquivos do Windows, por outro lado, tendem a ter uma codificação que é especificada nas propriedades do sistema de arquivos.

Se você precisar trabalhar com nomes de arquivos em uma codificação diferente, crie uma visualização traduzida desse sistema de arquivos com convmvfs . Vejo trabalhando com nomes de arquivos em uma codificação diferente ssh

Parece que seu sistema original tem nomes de arquivos codificados em latin-1. Seu sistema atual usa UTF-8 e a sequência de um byte que representa å em latin-1 ( 5 ) é uma sequência inválida em UTF-8, que ls imprime como ? . Seu processo de backup de alguma forma resultou em nomes de arquivos codificados em UTF-8. O Samba traduz nomes de arquivos com base em sua configuração.

Para acessar os arquivos originais com sua codificação nativa, faça uma visualização recodificada:

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

(Você pode precisar de outras opções dependendo de quais permissões e propriedades você deseja obter.)

    
por 08.03.2013 / 01:56
1

No Unix / Linux, um nome de arquivo pode conter qualquer caractere, exceto ''/'' (ASCII NUL) e ls(1) (barra, separador de diretório). Em particular, se você quiser dar nomes aos seus arquivos em Kanji em alguma codificação estranha, vá em frente. Você provavelmente só verá bobagens em ou outros comandos, mas nada de ruim acontecerá. É isso que você está vendo, o p? é renderizado como '?' , o od -c aqui é um atalho comum para "caractere desconhecido / não-ASCII".

Tente executar os dois nomes de arquivo em , ou seja, faça algo como:

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

(o glob é filtrar nomes não relevantes, ajustar ao gosto).

Apenas se o resultado for diferente, eu começo a me preocupar. Mas, dada sua configuração do Svedish, suspeito que o nome correto seja %code% . Talvez o outro seja um nome em latim-4 sobra de uma configuração anterior?

    
por 07.03.2013 / 20:47