我打算将备份与源进行比较,以手动验证数据是否正确。有些字符(例如 åäö)在原始数据上无法正确显示,但当客户端(通过 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å
呈现为p?
,'?'
这里是“未知/非 ASCII 字符”的常见快捷方式。
尝试通过 运行两个文件名od -c
,即执行以下操作:
ls /the/dir/offending/fi* | od -c
(glob是为了过滤掉不相关的名称,根据口味进行调整)。
只有当输出不同时我才会开始担心。但鉴于您的 Svedish 设置,我怀疑正确的名称是på
.也许另一个是以前设置中剩余的 Latin-4 名称?