Linux file команда, классифицирующая файлы

17

Мне нужно распознать тип данных, содержащихся в случайных файлах. Я новичок в Linux.

Я планирую использовать fileкоманду, чтобы понять, какой тип данных имеет файл. Я попробовал эту команду и получил вывод ниже.

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

Каковы возможные варианты ответов после выполнения fileкоманды? Например, в приведенной ниже расшифровке я получаю JPEG, ISO media, ASCII и т.д .:

Вывод на экран выглядит следующим образом

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


Обновление 1

Спасибо за ответы, и они разъяснили мне пару вещей.

Поэтому, если я правильно понимаю, папка / usr / share / mime / magic имеет базу данных, которая даст мне текущие возможные форматы файлов (выходные данные, которые я могу получить, когда набираю команду file и следую за ней по файлу). это верно? Правда ли, что всякий раз, когда вывод команды «Файл» содержит слово «текст», он относится к чему-то, что вы можете прочитать с помощью средства просмотра текста, и что-либо без «текста» является своего рода двоичным файлом?

user2543622
источник
6
В будущем публикация изображения вывода терминала действительно не рекомендуется (или кому-либо нравится). Используйте форматирование кода блока уценки.
HalosGhost
3
Я удалил картинку и разместил код.
user2543622
Так же, как примечание: если файл не может идентифицировать файл, часто TrID может. у него есть собственная база данных характеристик файлов, созданная сообществом, использующим его.
Джозеф говорит восстановить Монику

Ответы:

13

file использует несколько видов теста :

1: Если файл не существует, не может быть прочитан или его состояние файла не может быть определено, выходные данные должны указывать, что файл был обработан, но его тип не может быть определен.

Это будет вывод как cannot open file: No such file or directory.

2: Если файл не является обычным файлом, его тип файла должен быть идентифицирован. Каталог типов файлов, FIFO, сокет, специальный блок и специальный символ должны быть идентифицированы как таковые. Другие определяемые реализацией типы файлов также могут быть идентифицированы. Если файл является символической ссылкой, по умолчанию ссылка должна быть разрешена, и файл должен проверять тип файла, на который ссылается символическая ссылка. (См. -hИ -iварианты ниже.)

Это будет выводиться как .: directoryи /dev/sda: block special. Большая часть формата этого и предыдущего пункта частично определяется POSIX - вы можете положиться на определенные строки, находящиеся в выходных данных.

3: Если длина файла равна нулю, он должен быть идентифицирован как пустой файл.

Это foo: empty.

4. Файловая утилита должна исследовать начальный сегмент файла и делать предположения при определении его содержимого на основе чувствительных к положению тестов. (Ответ не гарантированно будет правильным; см. Параметры -d, -M и -m ниже.)

5: файловая утилита должна проверить файл и сделать предположение при определении его содержимого на основе контекстных системных тестов по умолчанию. (Ответ не гарантированно будет правильным.)

Эти два используют идентификацию магического числа и являются наиболее интересной частью команды. Магическое число это специальная последовательность байт , которая находится в известном месте в файл , который идентифицирует его типа. Традиционно это место - первые два байта, но термин был расширен, чтобы включить более длинные строки и другие местоположения. Смотрите этот другой вопрос для более подробной информации о магических числах в fileкоманде.

У fileкоманды есть база данных этих номеров и тому, какому типу они соответствуют; эта база данных обычно находится /usr/share/mime/magicи отображает содержимое файла в MIME-типы . Выходные данные там (часто часть, file -iесли вы не получаете его по умолчанию) будут определенным типом носителя или расширением. «Контекстно-зависимые тесты» используют такой же подход, но они немного размыты. Ничто из этого не может быть правильным, но они предназначены для хороших догадок.

fileтакже имеется база данных, сопоставляющая эти типы с именами, по которой он узнает, что файл, который он идентифицировал, application/pdfможет быть описан как PDF document. Эти понятные человеку имена также могут быть локализованы на другой язык. Это всегда будет какое-то высокоуровневое описание типа файла, понятное человеку, а не машине.

Большинство различных результатов, которые вы можете получить, будут получены на этих этапах. Вы можете посмотреть в magicфайле список поддерживаемых типов и то, как они определены - моя система знает 376 различных типов. Указанные имена и поддерживаемые типы определяются вашей системой упаковки и конфигурации, и поэтому ваша система может поддерживать больше или меньше, чем у меня, но, как правило, их много. libmagicтакже включает в себя дополнительные жесткие тесты в нем.

6: файл должен быть идентифицирован как файл данных.

Это foo: dataкогда он ничего не понял в файле.

Есть и другие маленькие теги, которые могут появиться. Исполняемый файл ( +x) будет включать " executable" в выводе, обычно через запятую. fileРеализация может также знать дополнительные вещи о некоторых форматах файлы , чтобы иметь возможность описать дополнительные пункты о них, как и в вашем « PDF document, version 1.4».

Майкл Гомер
источник
8

Страницы руководства обычно являются краткими ссылками, а не введениями. Начните со страницы Википедии .

fileсмотрит только на содержимое файла, а не на имя файла. (Также рассматриваются некоторые метаданные файла, такие как тип файла: каталог, символическая ссылка, именованный канал и т. Д. Но в тех случаях, которые вас интересуют, важен контент.)

fileобычно угадывает формат файла, просматривая первые несколько байтов и сравнивая их со встроенной таблицей магических чисел . Например, если файл начинается с %PDF, то fileсообщает «PDF документ» (и копает дальше, чтобы сообщить минимальную версию). Для типов файлов, которые не начинаются с магических чисел, он содержит эвристику, например, сообщает «текст ASCII», если все первые несколько байтов находятся в диапазоне ASCII для печати.

Вывод fileхрупок: он может варьироваться от варианта Unix к варианту Unix и от версии к версии. В Linux, Cygwin и * BSD fileкоманда поддерживает параметр, -iкоторый создает предсказуемый вывод в виде типа носителя MIME (IANA управляет списком стандартных типов носителей ). Деталей не так много, и результат менее понятен для человека, но результат предсказуем и удобен для компьютера.

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

Используйте, file --mime-typeесли вам нужен только сам тип MIME без информации о кодировании, например application/pdf. Укажите опцию, -bесли вы не хотите отображать имя файла в начале строки.

Жиль "ТАК - прекрати быть злым"
источник
5

Я хотел бы, чтобы вы прочитали ответ отсюда . Некоторые выдержки из ответа:

С man-страницы fileкоманды,

file Команда фактически выполняет 3 теста по определению типа файла.

Первый тест

Тесты файловой системы основаны на проверке возврата из системного вызова stat (2).

Второй тест

Тесты на магическое число используются для проверки файлов с данными в определенных фиксированных форматах.

Третий тест

Языковые тесты ищут определенные строки (cf names.h), которые могут появиться где угодно в первых нескольких блоках файла. Например, ключевое слово .br указывает, что файл, скорее всего, является входным файлом troff (1), так же как ключевое слово struct указывает на программу на Си.

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

Теперь, если предположить, что программа на C ++ запускается так, а третий тест проходит успешно,

#include <iostream.h>
bla
bla

В соответствии с третьим тестом ключевое слово, в #includeчастности, указывает, что оно относится к программе типа C, хотя у нас есть программа CPP . Теперь, когда я проверяю,

$ file example.cpp

example.cpp: ASCII C program text

Теперь концепции объектно-ориентированного подхода специфичны для C ++. Давайте создадим файл, специфичный для C ++ .

Я запускаю свою программу на C ++ как,

Class something
{
}
bla
bla

Теперь, когда я выпускаю

$ file example.cpp

Выход есть,

example.cpp: ASCII C++ program text

Это в основном объясняет, как fileкоманда работает с похожими файлами (в этом примере программы на C и C ++ обрабатываются одинаково до тех пор, пока мы не используем объектно-ориентированные функции, специфичные для C ++).

Рамеш
источник
1

Жиль и Майкл Гомер дали отличные ответы. к которому я вас отсылаю. Чтобы увидеть типы файлов, распознаваемые в вашей системе, попробуйте запустить

cat /usr/share/magic

Если это дает разрешение проблем или не существует, то, возможно,

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(может потребоваться настройка в зависимости от вашей системы), которая должна показать вам список типов файлов в вашей системе. Эта команда может долго выполняться в зависимости от размера вашей корневой файловой системы.

Warwick
источник