Как написать магический тестовый шаблон, соответствующий концу файла?
Я начинаю задаваться вопросом, возможно ли это вообще, поскольку многократный поиск на 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 скрипт должен сделать свое дело. Удачи!