
Это не то, что я пытаюсь сделать. Я пытаюсь разобраться в проблеме, которая уже произошла.
Одна из наших систем LIDAR в полевых условиях вернула диск для сбора данных с дубликатами файлов. У каждого файла на диске был второй дубликат с точно таким же именем, временем, датой и размером. Насколько мне известно, это должно быть невозможно.
Файлы записаны на ПК с Linux (CentOS 7), но хранятся на NTFS. Это потому, что они обрабатываются на ПК с Windows. Мы запускали это программное обеспечение и использовали одни и те же типы дисков в течение многих лет.
Я пытался думать о том, как это могло произойти, но не смог придумать ни одного. Если бы каким-то образом были запущены два экземпляра программного обеспечения хранилища, они бы сражались за один и тот же файл, а не записывали бы идентичный файл в один и тот же каталог. Это должно быть невозможно.
Затем я подумал, что, возможно, это была случайность с отображением файлов в Windows File Explorer. Я попросил их вынуть диск и вставить его в другой ПК, и он все равно показывал то же самое. Затем я задался вопросом, нет ли скрытых символов. Однако, когда они перенесли данные на свой сервер, он распознал, что имена файлов идентичны, и предложил им пропустить или перезаписать каждый дубликат.
Я бы списал это на случайность, но клиент непреклонен в своем желании докопаться до сути. Может ли кто-нибудь дать мне какое-либо представление или хотя бы теорию о том, как это произошло?
решение1
Я видел, как это происходило: в одном файле была обычная "a" (ASCII 0x61), в другом была очень похожая на нее "кириллица строчная буква a" (U+0430). В кириллическом алфавите есть много символов, которые выглядят точь-в-точь как латинские ("e", "o" - еще два частых)(*).
Один из способов определить проблему (и злодея): dir
или ls
сохранить файл и просмотреть вывод с помощью шестнадцатеричного редактора (в Linux вы также можете использовать более короткий вариант: ls * | hd
).
IIRC, в имени файла также можно использовать символ Unicode «НУЛЕВАЯ ШИРИНА ПРОБЕЛА (U+200B)».
(*) Я спрятал некоторые из них в тексте этого ответа...