web-dev-qa-db-ja.com

同じファイル、エンコーディングの問題のために異なるファイル名?

データが正しいことを手動で確認するために、バックアップをソースから比較しようとしていました。 åäöなどの一部の文字は元のデータに正しく表示されませんが、クライアント(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
9
user135361

Unixファイルシステムは、ファイル名がバイトで構成されているという意味でロケールに依存しない傾向があり、ASCIIの範囲外にある場合にそれらのバイトが何を意味するかを決定するのはアプリケーションの仕事です。今日のunixの規則一部のレガシー環境(主にアジア)を除いて、ファイル名とその他すべてをUTF-8でエンコードすることです。一方、Windowsファイルシステムは、ファイルシステムのプロパティで指定されるエンコードを持つ傾向があります。

別のエンコーディングのファイル名で作業する必要がある場合は、 convmvfs を使用してそのファイルシステムの翻訳されたビューを作成します。 sshを介した異なるエンコーディングのファイル名での作業 を参照してください。

元のシステムのファイル名はlatin-1でエンコードされているようです。現在のシステムはUTF-8を使用しており、latin-1(å)で\345を表す1バイトのシーケンスは、ls?として出力するUTF-8では無効なシーケンスです。バックアッププロセスの結果、ファイル名がUTF-8でエンコードされました。 Sambaは、構成に基づいてファイル名を変換します。

ネイティブエンコーディングで元のファイルにアクセスするには、再コード化されたビューを作成します。

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

(取得する権限と所有権によっては、他のオプションが必要になる場合があります。)

Unix/Linuxでは、ファイル名には_'\0'_(ASCII NUL)と_'/'_(スラッシュ、ディレクトリ区切り文字)以外の任意の文字を含めることができます。特に、漢字でファイルに奇妙なエンコーディングで名前を付けたい場合は、先に進んでください。おそらくls(1)または他のコマンドで意味不明な言葉が表示されるだけですが、悪いことは何も起こりません。これが表示されているとおりです。__は_p?_としてレンダリングされます。ここでの_'?'_は、「不明/非ASCII文字」の一般的なショートカットです。

両方のファイル名を_od -c_で実行してみてください。つまり、次のようにします。

_ls /the/dir/offending/fi* | od -c
_

(グロブは、関係のない名前を除外し、好みに合わせて調整することです)。

出力が異なる場合にのみ、私は心配し始めます。しかし、Svedishの設定を考えると、正しい名前は__だと思います。おそらくもう1つは、前の設定から残ったラテン語-4の名前ですか?

1
vonbrand