Один и тот же файл, другое имя файла из-за проблемы с кодировкой?


9

Я собирался создать резервную копию из источника, чтобы вручную проверить правильность данных. Некоторые символы, такие как ääö, не отображаются правильно в исходных данных, но, поскольку клиенты (через 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

Был ли sd [bc] 1 установлен на одной машине? Т.е. ж / одинаковые параметры монтирования и настройки локали?
Тинк

Нет, хорошее место Однако я только сейчас вытащил его из резервной копии на той же машине, и проблема остается. Смотрите вывод 'od', добавленный в редактировании.
user135361

Ответы:


6

Файловые системы Unix, как правило, не зависят от локали в том смысле, что имена файлов состоят из байтов, и дело приложения решать, что означают эти байты, если они выходят за пределы диапазона ASCII. Соглашение о Unix сегодня заключается в кодировании имен файлов и всего остального в UTF-8, за исключением некоторых устаревших сред (в основном азиатских). Файловые системы Windows, с другой стороны, обычно имеют кодировку, указанную в свойствах файловой системы.

Если вам нужно работать с именами файлов в другой кодировке, создайте перевод этой файловой системы с помощью convmvfs . Смотрите работу с именами файлов в другой кодировке через ssh

Похоже, что ваша оригинальная система имеет имена файлов, закодированные в латинице-1. Ваша текущая система использует UTF-8, а однобайтовая последовательность, представленная åв latin-1 ( \345), является недопустимой последовательностью в UTF-8, которая lsпечатается как ?. Ваш процесс резервного копирования как-то привел к именам файлов, закодированным в UTF-8. Samba переводит имена файлов в зависимости от конфигурации.

Чтобы получить доступ к исходным файлам с вашей собственной кодировкой, создайте перекодированное представление:

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

(Вам могут потребоваться другие варианты в зависимости от того, какие разрешения и права собственности вы хотите получить.)


Спасибо за объяснение того, как это работает. Не уверен, что это действительно помогает мне, вы говорите, что у меня (вероятно) есть файловые системы, которые имеют разные кодировки, и, таким образом, мне нужно создать переводное представление ... и т. Д.?
user135361

@ user135361 У вас есть наборы данных, где имена файлов имеют разные кодировки. Я расширил свой ответ.
Жиль "ТАК - перестань быть злым"

Это действительно помогло. Большое спасибо за ваше понимание.
user135361

1

В Unix / Linux имя файла может содержать любые символы, кроме '\0'(ASCII NUL) и '/'(косая черта, разделитель каталогов). В частности, если вы хотите дать своим файлам имена в кандзи в какой-то странной кодировке, просто продолжайте. Вы, вероятно, увидите только тарабарщину ls(1)или другие команды, но ничего плохого не произойдет. Это то, что вы видите, оно отображается как p?, '?'здесь есть общий ярлык для «неизвестного / не ASCII символа».

Попробуйте запустить оба имени файла od -c, то есть сделать что-то вроде:

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

(глобус состоит в том, чтобы отфильтровать несоответствующие имена, приспособиться к вкусу).

Только если результат будет другим, я начну беспокоиться. Но учитывая ваши настройки Сведиш, я подозреваю, что правильное имя . Возможно, другое - это название на латинице 4, оставшееся от предыдущей настройки?


Хотя это и не решение, я думаю, что вы предоставите ценное объяснение того, как это работает. Кроме того, я не знал о 'od', отредактированном для предоставления вывода od.
user135361
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.