Как написать магический тестовый шаблон, соответствующий концу файла? - PullRequest
7 голосов
/ 10 февраля 2011

Я начинаю задаваться вопросом, возможно ли это вообще, поскольку множественные поиски на SO, Google, Bing и linuxquestions.org ничего не дали.

Я заинтересован в расширении магических шаблонов, расположенных в /usr/share/magic(используется утилитой file(1)) для распознавания файлов на основе данных в конце файла или рядом с ним.Я смог сделать это для начала файла, а также для произвольных смещений в файле с самого начала.

Страница man довольно неплохо иллюстрирует некоторые стандартные случаи использования;к сожалению, не похоже, что есть способ индексировать с конца, а не с начала.Единственный обходной путь, который я мог придумать, состоял в том, чтобы принять подход на основе сценариев, использующий tac и / или lreverse, но чувствую, что это может быть недружественным для двоичных данных.

Кроме того, я хотел избежать любой другой обработки на основе сценариев- Я чувствую, что это должно быть выполнимо с правильным волшебством файла.Есть идеи?

1 Ответ

5 голосов
/ 22 марта 2011

Это невозможно.file(1) также предназначен для работы с трубами.Вы не можете использовать lseek(2) на каналах, чтобы добраться до конца файла.Чтение всего файла до конца будет очень медленным (и file(1) изо всех сил пытается быть быстрым), и если он на самом деле читает из канала, он может никогда не встретить конец файла, что будет еще хуже.

Что касается документации, то в случае программного обеспечения с открытым исходным кодом сам исходный код является окончательной документацией.Если вы застряли в таком случае, всегда полезно посмотреть.Функция file_or_fd() в src/magic.c дает подсказку.Используйте Источник, Люк!; -)

В вашем конкретном случае я хотел бы еще раз взглянуть на рассматриваемый формат файла, и если он действительно не может быть проанализирован с помощью file(1), тогда короткий Perl или Python-скрипт должен выполнитьтрюк.Удачи!

...