同一文件,由于编码问题,文件名不同?


9

我正准备从源中比较备份,以手动验证数据是否正确。某些字符(例如åäö)未正确显示在原始数据上,但是由于客户端(通过samba)正确解释了这些字符,因此无需担心。从备份还原的数据正确显示了字符,导致差异不认为它们是相同的文件(具有差异,而是完全不同的文件)。

md5总和,相同文件但名称不同。

# 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

挂载选项和文件系统

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

语言环境

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是否已填充在同一台计算机上?即,带有相同的安装选项和语言环境设置?
2013年

不,好地方。但是,我确实刚刚从同一台计算机上的备份中提取了它,问题仍然存在。查看编辑中添加的“ od”的输出。
user135361 2013年

Answers:


6

在文件名由字节组成的意义上,Unix文件系统通常是与语言环境无关的,并且如果这些字节超出ASCII范围,则由应用程序负责确定这些字节的含义。如今,Unix上的约定是对文件名和其他所有内容进行UTF-8编码,除了一些传统环境(大多数是亚洲环境)。另一方面,Windows文件系统倾向于具有在文件系统属性中指定的编码。

如果需要使用其他编码的文件名,请使用convmvfs创建该文件系统的转换视图。查看 通过ssh使用不同编码的文件名

看来您的原始系统具有以latin-1编码的文件名。您当前的系统使用UTF-8,ålatin-1(\345)中表示的一字节序列是UTF-8中的无效序列,其ls输出为?。您的备份过程以某种方式导致文件名以UTF-8编码。Samba根据其配置转换文件名。

要使用本机编码访问原始文件,请进行重新编码的视图:

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

(您可能需要其他选项,具体取决于要获取的权限和所有权。)


感谢您对它如何工作的解释。不确定这是否真的对我有帮助,您是否要告诉我(可能)我的文件系统具有不同的编码,因此我需要创建..etc的翻译视图?
user135361 2013年

@ user135361您有数据集,其中文件名具有不同的编码。我扩大了答案。
吉尔斯(Gillles)“所以-别再邪恶了”

这确实做到了。非常感谢您的见解。
user135361 2013年

1

在Unix / Linux中,文件名可以包含除'\0'(ASCII NUL)和'/'(斜杠,目录分隔符)之外的任何字符。特别是,如果您想以某种怪异的编码为汉字赋予文件名,那就继续吧。您可能只会看到乱码ls(1)或其他命令,但不会发生任何不良情况。这就是您所看到的,呈现为p?'?'这是“未知/非ASCII字符”的常用快捷方式。

尝试通过运行两个文件名od -c,即执行以下操作:

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

(全局名称是过滤掉不相关的名称,调整以适应口味)。

只有输出不同时,我才开始担心。但是考虑到您的Svedish设置,我怀疑正确的名称是。也许另一个是先前设置中剩余的Latin-4名称?


尽管不是解决方案,但我认为您提供了有关其工作原理的有价值的解释。另外,我不知道'od'是经过编辑以提供od输出的。
user135361 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.