File yang sama, nama file yang berbeda karena masalah pengkodean?


9

Saya akan membuat cadangan dari sumbernya untuk memverifikasi secara manual bahwa datanya benar. Beberapa karakter, seperti åäö, tidak ditampilkan dengan benar pada data asli tetapi karena klien (lebih dari samba) menafsirkannya dengan benar, tidak ada yang perlu dikhawatirkan. Data yang dipulihkan dari cadangan menunjukkan karakter dengan benar, menyebabkan diff tidak menganggapnya sebagai file yang sama (dengan file diff, tetapi agak berbeda).

jumlah md5, file yang sama tetapi nama yang berbeda.

# 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

Pasang opsi dan sistem file

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

Lokal

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

Sudahkah sd [bc] 1 diisi pada mesin yang sama? Yaitu, dengan opsi mount dan opsi lokal yang sama?
tink

Tidak, tempat yang bagus. Namun saya menariknya baru dari cadangan pada mesin yang sama tadi, dan masalahnya tetap ada. Lihat output 'od' yang ditambahkan di edit.
user135361

Jawaban:


6

Unix filesystems cenderung bersifat agnostik lokal dalam arti bahwa nama file terdiri dari byte dan bisnis aplikasi untuk memutuskan apa arti byte tersebut jika berada di luar rentang ASCII. Konvensi unix hari ini adalah untuk menyandikan nama file dan yang lainnya di UTF-8, terlepas dari beberapa lingkungan lama (kebanyakan Asia). Sistem file Windows, di sisi lain, cenderung memiliki penyandian yang ditentukan dalam properti filesystem.

Jika Anda perlu bekerja dengan nama file dalam pengkodean yang berbeda, buat tampilan terjemahan sistem file itu dengan convmvfs . Lihat bekerja dengan nama file dalam pengkodean berbeda melalui ssh

Tampaknya sistem asli Anda memiliki nama file yang disandikan dalam bahasa latin-1. Sistem Anda saat ini menggunakan UTF-8, dan urutan satu byte yang mewakili ålatin-1 ( \345) adalah urutan yang tidak valid di UTF-8 yang lsdicetak sebagai ?. Proses pencadangan Anda entah bagaimana menghasilkan nama file yang disandikan dalam UTF-8. Samba menerjemahkan nama file berdasarkan konfigurasinya.

Untuk mengakses file asli dengan penyandian asli Anda, buat tampilan yang dikodekan ulang:

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

(Anda mungkin perlu opsi lain tergantung pada izin dan kepemilikan apa yang ingin Anda peroleh.)


Terima kasih atas penjelasan cara kerjanya. Tidak yakin ini benar-benar membantu saya, apakah Anda memberi tahu saya (mungkin) memiliki sistem file yang memiliki pengkodean yang berbeda, dan dengan demikian saya perlu membuat tampilan terjemahan dll ..?
user135361

@ user135361 Anda memiliki kumpulan data di mana nama file memiliki penyandian yang berbeda. Saya telah memperluas jawaban saya.
Gilles 'SO- stop being evil'

Ini benar-benar berhasil. Terima kasih banyak atas wawasan Anda.
user135361

1

Di Unix / Linux, nama file dapat berisi karakter apa pun kecuali '\0'(ASCII NUL) dan '/'(slash, pemisah direktori). Secara khusus, jika Anda ingin memberikan nama file Anda di Kanji dalam beberapa penyandian aneh, langsung saja. Anda mungkin hanya akan melihat omong kosong pada ls(1)atau perintah lain, tetapi tidak ada hal buruk yang akan terjadi. Itulah yang Anda lihat, diterjemahkan sebagai p?, di '?'sini adalah jalan pintas umum untuk "karakter tidak dikenal / non-ASCII".

Coba jalankan kedua nama file melalui od -c, yaitu melakukan sesuatu seperti:

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

(Gumpalan adalah untuk menyaring nama yang tidak relevan, sesuaikan dengan selera).

Hanya jika hasilnya berbeda maka saya mulai khawatir. Tetapi mengingat pengaturan Svedish Anda, saya menduga nama yang benar . Mungkin yang lain adalah nama dalam sisa Latin-4 dari pengaturan sebelumnya?


Meski bukan solusi, saya pikir Anda memberikan penjelasan yang berharga tentang cara kerjanya. Selain itu, saya tidak tahu 'od', diedit untuk memberikan output od.
user135361
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.