Linux

由於編碼問題,相同的文件,不同的文件名?

  • March 9, 2013

我正要從它的源中對備份進行比較,以手動驗證數據是否正確。一些字元,比如 åäö,在原始數據上沒有正確顯示,但是當客戶端(通過 samba)正確解釋它時,沒有什麼可擔心的。從備份中恢復的數據正確顯示了字元,導致 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=

從 -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

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

(您可能需要其他選項,具體取決於您想要獲得的權限和所有權。)

引用自:https://unix.stackexchange.com/questions/67232