Cùng một tệp, tên tệp khác nhau do vấn đề mã hóa?


9

Tôi đã định khác một bản sao lưu từ nguồn của nó để xác minh rằng dữ liệu là chính xác. Một số ký tự, như åäö, không được hiển thị chính xác trên dữ liệu gốc nhưng vì các máy khách (trên samba) diễn giải chính xác nên không có gì phải lo lắng. Dữ liệu được khôi phục từ bản sao lưu hiển thị chính xác các ký tự, dẫn đến diff không coi chúng là cùng một tệp (với các tệp khác nhau, nhưng hoàn toàn khác nhau).

md5 tổng, cùng một tập tin nhưng tên khác nhau.

# 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

Tùy chọn gắn kết và hệ thống tập tin

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

Địa phương

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

Có sd [bc] 1 đã được điền trên cùng một máy không? Tức là, có cùng tùy chọn gắn kết và cài đặt ngôn ngữ không?
tink

Không, điểm tốt. Tuy nhiên, tôi đã lấy nó mới từ bản sao lưu trên cùng một máy và vấn đề vẫn còn. Xem đầu ra của 'od' được thêm vào trong bản chỉnh sửa.
dùng135361

Câu trả lời:


6

Các hệ thống tệp Unix có xu hướng không rõ ràng theo nghĩa là tên tệp bao gồm các byte và đó là công việc của ứng dụng để quyết định các byte đó có nghĩa gì nếu chúng nằm ngoài phạm vi ASCII. Quy ước về unix ngày nay là mã hóa tên tệp và mọi thứ khác trong UTF-8, ngoài một số môi trường kế thừa (chủ yếu là châu Á). Mặt khác, các hệ thống tệp Windows có xu hướng mã hóa được chỉ định trong các thuộc tính hệ thống tệp.

Nếu bạn cần làm việc với tên tệp theo một mã hóa khác, hãy tạo chế độ xem được dịch của hệ thống tệp đó bằng các biểu thức . Xem làm việc với tên tệp trong một mã hóa khác trên ssh

Dường như hệ thống ban đầu của bạn có tên tệp được mã hóa theo tiếng Latin-1. Hệ thống hiện tại của bạn sử dụng UTF-8 và chuỗi một byte đại diện cho ålatin-1 ( \345) là chuỗi không hợp lệ trong UTF-8 lsin dưới dạng ?. Quá trình sao lưu của bạn bằng cách nào đó đã dẫn đến tên tệp được mã hóa trong UTF-8. Samba dịch tên tập tin dựa trên cấu hình của nó.

Để truy cập các tệp gốc bằng mã hóa gốc của bạn, hãy tạo chế độ xem được mã hóa lại:

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

(Bạn có thể cần các tùy chọn khác tùy thuộc vào quyền và quyền sở hữu mà bạn muốn có được.)


Cảm ơn đã giải thích về cách thức hoạt động. Không chắc chắn điều này thực sự giúp ích cho tôi, bạn có nói với tôi rằng tôi (có khả năng) có các hệ thống tập tin có mã hóa khác nhau, và do đó tôi cần tạo một chế độ xem dịch của .. vv?
dùng135361

@ user135361 Bạn có bộ dữ liệu trong đó tên tệp có mã hóa khác nhau. Tôi đã mở rộng câu trả lời của mình.
Gilles 'SO- ngừng trở thành ác quỷ'

Điều này thực sự đã lừa Cảm ơn rất nhiều cho cái nhìn sâu sắc của bạn.
dùng135361

1

Trong Unix / Linux, một tên tệp có thể chứa bất kỳ ký tự nào ngoại trừ '\0'(ASCII NUL) và '/'(dấu gạch chéo, dấu tách thư mục). Cụ thể, nếu bạn muốn đặt tên tệp của mình bằng Kanji theo một số mã hóa lạ, chỉ cần tiếp tục. Bạn có thể sẽ chỉ thấy vô nghĩa trên ls(1)hoặc các lệnh khác, nhưng sẽ không có gì xấu xảy ra. Đó là những gì bạn đang thấy, được hiển thị dưới dạng p?, '?'đây là một lối tắt phổ biến cho "ký tự không xác định / không phải ASCII".

Hãy thử chạy cả hai tên tệp thông qua od -c, tức là làm một cái gì đó như:

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

(toàn cầu là để lọc ra những cái tên không liên quan, điều chỉnh theo sở thích).

Chỉ khi đầu ra khác nhau, tôi sẽ bắt đầu lo lắng. Nhưng với thiết lập Svedish của bạn, tôi nghi ngờ tên chính xác là . Có lẽ cái còn lại là một cái tên trong tiếng Latin-4 còn sót lại từ thiết lập trước đó?


Mặc dù không phải là một giải pháp, tôi nghĩ bạn cung cấp một lời giải thích có giá trị về cách thức hoạt động của nó. Ngoài ra, tôi không biết về 'od', được chỉnh sửa để cung cấp đầu ra od.
dùng135361
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.