Команда файлів Linux, що класифікує файли


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 має базу даних, яка дасть мені можливі поточні формати файлів (виходи, які я можу отримати, коли я набираю команду файлу та слідкую за нею за файлом). це правильно? Чи правда, що коли команда "Файл" містить слово "текст", воно посилається на те, що ви можете прочитати за допомогою засобу перегляду тексту, і що-небудь без "тексту" - це якесь двійкове?


6
Надалі розміщувати зображення кінцевого висновку дійсно не рекомендується (або комусь подобається). Використовуйте форматування блоку коду розмітки.
HalosGhost

3
Я видалив знімок і опублікував код.
користувач2543622

Як зауваження: якщо файл не може ідентифікувати файл, часто 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" у висновку, як правило, розділений комами. ThefileРеалізація може також знати додаткові речі про деякі форматах файли , щоб мати можливість описати додаткові пункти про них, як і в вашому « 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

Я хотів би, щоб ви прочитали відповідь звідси . Деякі уривки відповіді:

З сторінки управління fileкомандою,

file команда фактично виконує 3 тести на визначення типу файлу.

Перший тест

Тести файлової системи ґрунтуються на вивченні повернення зі стану (2) системного виклику.

Другий тест

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

Третій тест

Мовні тести шукають окремі рядки (cf names.h), які можуть з’являтися будь-де в перших кількох блоках файлу. Наприклад, ключове слово .br вказує на те, що цей файл, швидше за все, є вхідним файлом troff (1), подібно до того, як структура ключового слова вказує на програму C.

Результат 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

(може знадобитися налаштування залежно від вашої системи), який повинен показувати список типів файлів у вашій системі. Ця команда може зайняти багато часу, залежно від розміру вашої кореневої файлової системи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.