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

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

我打算将备份与源进行比较,以手动验证数据是否正确。有些字符(例如 åäö)在原始数据上无法正确显示,但当客户端(通过 samba)正确解释它时,就无需担心。从备份恢复的数据正确显示了字符,导致 diff 不认为它们是相同的文件(有 diff,而是完全不同的文件)。

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

答案1

Unix 文件系统往往与区域设置无关,因为文件名由字节组成,如果这些字节超出 ASCII 范围,则由应用程序来决定它们的含义。如今,Unix 上的惯例是使用 UTF-8 对文件名和其他所有内容进行编码,除了一些遗留环境(主要是亚洲环境)。另一方面,Windows 文件系统往往具有在文件系统属性中指定的编码。

如果您需要使用不同编码的文件名,请使用以下命令创建该文件系统的翻译视图转换文件系统。看 通过 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

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

答案2

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

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

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

(glob是为了过滤掉不相关的名称,根据口味进行调整)。

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

相关内容