Как написать магический тестовый шаблон, соответствующий концу файла?

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам