File (команда)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
file
Тип Файловий детектор
Розробник AT&T Bell Laboratories
Перший випуск 1973 як частина Unix Research Version 4; 1986 як програмне забезпечення з відкритим кодом
Платформа Cross-platform
Операційна система Unix, Unix-like
Мова програмування C
Ліцензія BSD license, CDDL
Репозиторій https://github.com/file/file
Вебсайт darwinsys.com/file/

file — стандартна команда в Unix-подібних операційних системах, яка призначена для розпізнавання типу даних, які містяться всередині комп'ютерного файлу.

Історія[ред. | ред. код]

Свій початок команда file бере з 1973, коли вона вперше з'явилася в Unix Research Version 4. System V принесла головне оновлення з деякими важливими змінами, які полягали в тому, що інформація про типи файлів розташовувалася в зовнішньому текстовому файлі замість того, щоб вкомпільовуватися в двійковий код самої програми.

Більшість BSD і Linux дистрибутивів використовують вільну, з відкритим кодом, реімплементацію, яка була створена в 1986-87 Ian Darwin фактично з нуля.

Специфікація[ред. | ред. код]

Single UNIX Specification (SUS) визначає серію тестів, які повинні бути здійснені над файлом, вказаним в командному рядку:

  1. якщо файл не може бути зчитаний або його Unix-тип невизначений, то команда file повідомить, що файл був опрацьований, але його тип був невизначений;
  2. file повинен бути в змозі визначати типи каталог, FIFO, socket, блочний спеціальний файл і символьний спеціальний файл;
  3. файли нульової довжини ідентифікуються як такі;
  4. розглядається початкова частина файлу і file використовує тести, що залежать від позиції всередині файлу;
  5. весь файл розглядається і file використовує контекстно-залежні тести;
  6. файл ідентифікується як data-файл.

Позиційно-чутливі тести команди file, як правило, реалізуються шляхом зіставлення різних місць розташування в файлі з текстовою базою даних, яка містить сигнатури (послідовності байтів, які слугують «візитною карткою» якогось типу файлів). Цей підхід відрізняється від інших простих методів, таких як аналіз по розширенню файлу або за схемою на зразок MIME.

В більшості реалізацій команда file використовує базу даних для перевірки перших байтів файлу. Ця база даних міститься в файлі під назвою magic, який зазвичай розташований в /etc/magic, /usr/share/file/magic або схожих місцях файлової системи.

Використання[ред. | ред. код]

SUS[1] визначає наступні параметри, які можуть бути передані команді 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 реалізована саме з використанням цієї бібліотеки.

Посилання[ред. | ред. код]

  1. The Open Group Base Specifications Issue 7 — file command. Архів оригіналу за 12 жовтня 2018. Процитовано 12 квітня 2020.

Зовнішні посилання[ред. | ред. код]

Сторінки man[ред. | ред. код]