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


9

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

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

sd [bc] 1が同じマシンに実装されていますか?つまり、同じマウントオプションとロケール設定を使用していますか?
2013年

いいえ、良い場所です。ただし、同じマシンのバックアップから今すぐ取り出しましたが、問題は解決しません。編集に追加された「od」の出力を確認します。
user135361 2013年

回答:


6

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

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

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

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

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

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


それがどのように機能するかの説明をありがとう。これが本当に役立つかどうかはわかりませんが、エンコーディングが異なるファイルシステムがありそうなので、..などの翻訳されたビューを作成する必要がありますか?
user135361 2013年

@ user135361ファイル名のエンコーディングが異なるデータセットがあります。答えを広げました。
Gilles 'SO-邪悪なことをやめる'

これで本当にうまくいきました。あなたの洞察をありがとう。
user135361

1

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

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

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

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

出力が異なる場合のみ、私は心配し始めます。しかし、あなたのスヴェディッシュ語の設定を考えると、正しい名前はだと思います。おそらくもう1つは、以前のセットアップから残ったLatin-4の名前ですか?


解決策ではありませんが、それがどのように機能するかについての貴重な説明を提供すると思います。さらに、od出力を提供するために編集された「od」については知りませんでした。
user135361 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.