Gleiche Datei, anderer Dateiname aufgrund eines Codierungsproblems?

9

Ich wollte gerade ein Backup von der Quelle unterscheiden, um manuell zu überprüfen, ob die Daten korrekt sind. Einige Zeichen, wie z. B. åäö, werden in den Originaldaten nicht korrekt angezeigt, aber da die Clients (über Samba) sie richtig interpretieren, besteht kein Grund zur Sorge. Die aus der Sicherung wiederhergestellten Daten zeigen die Zeichen korrekt an, was dazu führt, dass diff sie nicht als dieselben Dateien betrachtet (mit Unterschieden, sondern völlig unterschiedlichen Dateien).

md5 Summen, gleiche Datei, aber anderer Name.

# 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

Mounten Sie Optionen und Dateisysteme

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

Gebietsschema

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
user135361
quelle
Wurde sd [bc] 1 auf demselben Computer ausgefüllt? Dh mit den gleichen Einstellungen für Mount-Option und Gebietsschema?
Tink
Nein, guter Ort. Ich habe es jedoch gerade frisch aus dem Backup auf demselben Computer gezogen, und das Problem besteht weiterhin. Siehe die Ausgabe von 'od', die in der Bearbeitung hinzugefügt wurde.
user135361

Antworten:

6

Unix-Dateisysteme sind in der Regel länderunabhängig, da Dateinamen aus Bytes bestehen und es Aufgabe der Anwendung ist, zu entscheiden, was diese Bytes bedeuten, wenn sie außerhalb des ASCII-Bereichs liegen. Die heutige Konvention unter Unix besteht darin, Dateinamen und alles andere in UTF-8 zu codieren, abgesehen von einigen älteren Umgebungen (hauptsächlich asiatische). Windows-Dateisysteme haben normalerweise eine Codierung, die in den Dateisystemeigenschaften angegeben ist.

Wenn Sie mit Dateinamen in einer anderen Codierung arbeiten müssen, erstellen Sie mit convmvfs eine übersetzte Ansicht dieses Dateisystems . Siehe Arbeiten mit Dateinamen in einer anderen Codierung als ssh

Es scheint, dass Ihr ursprüngliches System Dateinamen hat, die in Latin-1 codiert sind. Ihr aktuelles System verwendet UTF-8, und die åin Latin-1 ( \345) dargestellte Ein-Byte-Sequenz ist eine ungültige Sequenz in UTF-8, die lsals gedruckt wird ?. Ihr Sicherungsprozess hat irgendwie zu Dateinamen geführt, die in UTF-8 codiert sind. Samba übersetzt Dateinamen basierend auf seiner Konfiguration.

Erstellen Sie eine neu codierte Ansicht, um mit Ihrer nativen Codierung auf die Originaldateien zuzugreifen:

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

(Je nachdem, welche Berechtigungen und Eigentumsrechte Sie erhalten möchten, benötigen Sie möglicherweise andere Optionen.)

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank für die Erklärung, wie es funktioniert. Sie sind sich nicht sicher, ob dies mir wirklich hilft. Sagen Sie mir, dass ich (wahrscheinlich) Dateisysteme mit unterschiedlichen Codierungen habe und daher eine übersetzte Ansicht von .. etc erstellen muss?
user135361
@ user135361 Sie haben Datensätze, in denen Dateinamen unterschiedliche Codierungen haben. Ich habe meine Antwort erweitert.
Gilles 'SO - hör auf böse zu sein'
Das hat wirklich den Trick gemacht. Vielen Dank für Ihren Einblick.
user135361
1

Unter Unix / Linux kann ein Dateiname ein beliebiges Zeichen außer '\0'(ASCII NUL) und '/'(Schrägstrich, Verzeichnistrennzeichen) enthalten. Insbesondere wenn Sie Ihren Dateinamen in Kanji in einer seltsamen Codierung geben möchten, fahren Sie einfach fort. Sie werden wahrscheinlich nur Kauderwelsch ls(1)oder andere Befehle sehen, aber nichts Schlimmes wird passieren. Das ist, was Sie sehen, das wird gerendert als p?, das '?'hier ist eine übliche Abkürzung für "unbekanntes / Nicht-ASCII-Zeichen".

Versuchen Sie, beide Dateinamen durchzulaufen od -c, dh gehen Sie wie folgt vor:

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

(Der Globus soll nicht relevante Namen herausfiltern, nach Geschmack anpassen).

Nur wenn sich die Ausgabe unterscheidet, würde ich mir Sorgen machen. Aber angesichts Ihres Svedish-Setups vermute ich, dass der richtige Name lautet . Vielleicht ist der andere ein Name in Latin-4, der von einem früheren Setup übrig geblieben ist?

vonbrand
quelle
Obwohl dies keine Lösung ist, geben Sie meiner Meinung nach eine wertvolle Erklärung dafür, wie es funktioniert. Außerdem wusste ich nichts von 'od', das so bearbeitet wurde, dass es eine od-Ausgabe liefert.
user135361