File (команда)
file
— стандартна команда в Unix-подібних операційних системах, яка призначена для розпізнавання типу даних, які містяться всередині комп'ютерного файлу.
Тип | Файловий детектор |
---|---|
Розробник | AT&T Bell Laboratories |
Перший випуск | 1973 як частина Unix Research Version 4; 1986 як програмне забезпечення з відкритим кодом |
Версії | 5.41 (18 жовтня 2021)[1] |
Репозиторій | https://github.com/file/file |
Платформа | Cross-platform |
Операційна система | Unix, Unix-like |
Мова програмування | C |
Ліцензія | BSD license, CDDL |
Вебсайт | darwinsys.com/file/ |
Історія
Свій початок команда file
бере з 1973, коли вона вперше з'явилася в Unix Research Version 4. System V принесла головне оновлення з деякими важливими змінами, які полягали в тому, що інформація про типи файлів розташовувалася в зовнішньому текстовому файлі замість того, щоб вкомпільовуватися в двійковий код самої програми.
Більшість BSD і Linux дистрибутивів використовують вільну, з відкритим кодом, реімплементацію, яка була створена в 1986-87 Ian Darwin фактично з нуля.
Специфікація
Single UNIX Specification (SUS) визначає серію тестів, які повинні бути здійснені над файлом, вказаним в командному рядку:
- якщо файл не може бути зчитаний або його Unix-тип невизначений, то команда
file
повідомить, що файл був опрацьований, але його тип був невизначений; file
повинен бути в змозі визначати типи каталог, FIFO, socket, блочний спеціальний файл і символьний спеціальний файл;- файли нульової довжини ідентифікуються як такі;
- розглядається початкова частина файлу і
file
використовує тести, що залежать від позиції всередині файлу; - весь файл розглядається і
file
використовує контекстно-залежні тести; - файл ідентифікується як
data
-файл.
Позиційно-чутливі тести команди file
, як правило, реалізуються шляхом зіставлення різних місць розташування в файлі з текстовою базою даних, яка містить сигнатури (послідовності байтів, які слугують «візитною карткою» якогось типу файлів). Цей підхід відрізняється від інших простих методів, таких як аналіз по розширенню файлу або за схемою на зразок MIME.
В більшості реалізацій команда file
використовує базу даних для перевірки перших байтів файлу. Ця база даних міститься в файлі під назвою magic
, який зазвичай розташований в /etc/magic
, /usr/share/file/magic
або схожих місцях файлової системи.
Використання
SUS[2] визначає наступні параметри, які можуть бути передані команді file
:
- -M file - вказує ім’я файлу, що містить позиційно-залежні тести, які слід застосувати до файлу з метою його класифікації; позиційно-залежні і контекстно-залежні тести, які ідуть за замовчуванням, не проводяться.
- -m file - схоже на -M, але тести за замовчуванням будуть проведені після тестів, які містяться у вказаному файлі.
- -d - поведінка за замовчуванням, виконуються всі позиційно-залежні і контекстно-залежні тести над вказаним файлом.
- -h - не переходити за символьним посиланням, яке вказує на файл або каталог (інформація про саме символьне посилання).
- -L - переходити за символьним посиланням, яке вказує на файл або каталог (інформація про файл або каталог).
- -i - не класифікувати файл, просто ідентифікувати його як: неіснуючий, спеціальний блочний файл, спеціальний файл символів, каталог, іменований канал, сокет, символьне посилання чи звичайний файл. Linux і BSD системи поводяться по різному з цим параметром.
Інші Unix і Unix-подібні операційні системи можуть мати додаткові параметри (наприклад, -s 'special files', -k 'keep-going' або -r 'raw').
Фактично команда file
може сказати тільки на що схожий файл, а не чим він насправді є (які дані дійсно містяться всередині файлу). Тому достатньо легко можна надурити програму, помістивши всередину файлу, який тестується, сигнатуру іншого типу файлу. Тому ця команда не може бути використана, як безпечний інструмент.
Приклади
$ file file.c file.c: C program text
$ file program program: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped
$ file /dev/hda1 /dev/hda1: block special (0/0)
$ file -s /dev/hda1 /dev/hda1: Linux/i386 ext2 filesystem
Варто зауважити, що -s не є стандартним параметром і доступна тільки на деяких платформах.
$ file -k -r libmagic-dev_5.35-4_armhf.deb # (on Linux) libmagic-dev_5.35-4_armhf.deb: Debian binary package (format 2.0) - current ar archive - data
Якщо програмі передано нестандартний параметр -k, то команда не зупиняється після того, як знайде перше співпадіння по сигнатурі, а продовжує аналізувати файл на предмет інших співпадінь.
$ file compressed.gz compressed.gz: gzip compressed data, deflated, original filename, `compressed',last modified: Thu Jan 26 14:08:23 2006, os: Unix
$ file -i compressed.gz # (on Linux) compressed.gz: application/x-gzip; charset=binary
$ file data.ppm data.ppm: Netpbm PPM "rawbits" image data
$ file /bin/cat /bin/cat: Mach-O universal binary with 2 architectures /bin/cat [for architecture ppc7400): Mach-O executable ppc /bin/cat (for architecture i386): Mach-O executable i386
Бібліотека libmagic
Починаючи з версії 4.00 програми file
, її функціонал було вбудовано в бібліотеку libmagic
, яку можна використовувати під час написання програм на C і C-подібних мовах; версія для Linux та NetBSD реалізована саме з використанням цієї бібліотеки.