НАЗВА

fileвизначення типу файла

КОРОТКИЙ ОПИС

file [-bcdEhiklLNnprsSvzZ0] [--apple] [--exclude-quiet] [--extension] [--mime-encoding] [--mime-type] [-e назва_тесту] [-F роздільник] [-f файл_назв] [-m файли_контрольних_послідовностей] [-P назва=значенняfile ... file -C [-m файли_контрольних_послідовностей] file [- -help]

ОПИС

Цю сторінку підручника присвячено документації щодо версії 5.44 програми file.
file виконує тестування кожного аргументу у спробах його класифікувати. Передбачено три набори перевірок, які буде виконано у такому порядку: перевірки файлової системи, перевірки контрольних послідовностей і перевірки мови. Перша пройдена перевірка призведе до виведення типу файла.
Виведені дані щодо типу, зазвичай, містять одне з таких слів: text (файл містить лише друковані символи і деякі типові контрольні символи, його, ймовірно, безпечно читати у терміналі ASCII), executable (файл містить результати компіляції програми у формі, яку може обробляти ядро UNIX або іншої системи) або data для усього іншого (дані, зазвичай, є “двійковими” або не призначеними для друку). Виключеннями є файли у різних знаних форматах даних (файли ядра, архіви tar), які містять двійкові дані. При внесенні змін до файлів контрольних послідовностей або самої програми, переконайтеся, що збережено ці ключові слова. Робота користувачів залежить від відомостей щодо того, що для усіх придатних до читання файлів у каталозі буде виведено слово “text”. Не робіть так, як зробили у Берклі, і не міняйте “shell commands text” на “shell script”.
Перевірки файлової системи засновано на вивченні даних, які повернуто системним викликом stat(2). Програма перевіряє, чи не є файл порожнім і чи не є він певним чином спеціальним файлом. Усі відомі типи файлів, які відповідають системі, у якій ви працюєте (сокети, символічні посилання або іменовані канали (FIFO) у тих системах, де їх реалізовано), буде розпізнано, якщо їх визначено у загальносистемному файлі заголовків <sys/stat.h>.
Перевірки контрольних послідовностей використовують для визначення форматів для файлів із даними у певному фіксованому форматі. Яскравим прикладом цього є двійкові виконувані файли (зібрані програми), подібні до a.out, формат яких визначено у <elf.h>, <a.out.h> і, можливо, <exec.h> у стандартному каталозі include. У цих файлах у певному місці на початку файла зберігається “контрольне число”, яке вказує операційній системі UNIX, що файл є двійковим виконуваним файлом і вказує тип, один із декількох. Концепцію “контрольного числа” було розширено на файли даних. За її допомогою може бути описано будь-який файл із певним інваріантним ідентифікатором із невеликим фіксованим відступом у даних файла. Дані для ідентифікації цих файлів буде прочитано із /etc/magic та зібраних файлів контрольних послідовностей /usr/share/misc/magic.mgc або файлів у каталозі /usr/share/file/misc/magic, якщо зібраного файла не існує. Крім того, якщо існує $HOME/.magic.mgc або $HOME/.magic, його буде використано з вищим пріоритетом над загальносистемними файлами контрольних послідовностей.
Якщо файл не відповідає жодному із записів у файлі контрольних послідовностей, програма спробує визначити, чи не є він текстовим файлом. Кодування ASCII, ISO-8859-x, 8-бітові кодування поза ISO поза ASCII (подібні до використаних у системах Macintosh та IBM PC), кодування UTF-8 Unicode, кодування UTF-16 Unicode та набори символів EBCDIC може бути визначено за різними діапазонами та послідовностями байтів, на основі яких створюється друкований текст для кожного з наборів. Якщо файл проходить будь-яку з перевірок, програма повідомить про набір символів (кодування). Файли ASCII, ISO-8859-x, UTF-8, і розширення ASCII буде ідентифіковано як “text”, оскільки їх, здебільшого, можна читати майже у будь-якому терміналі; UTF-16 і EBCDIC є лише “character data”, оскільки, хоча вони містять текст, це текст, який потребує трансляції перед читанням. Крім того, file спробує визначити інші характеристики файлів текстового типу. Якщо рядки файла завершуються на CR, CRLF або NEL, замість стандартного для Unix LF, програма про це повідомить. Також буде ідентифіковано файли, які містять вбудовані екрановані послідовності та перекреслення.
Після визначення file набору символів, який використано у файлі текстового типу, програма спробує визначити, якою мовою написано файл. У перевірках мови буде виконано пошук певних рядків (порівняйте з <names.h> ), які може бути використано будь-де у перших декількох блоках файла. Наприклад, ключове слово .br вказує на високу ймовірність того, що це файл вхідних даних troff(1), так само, як ключове слово struct вказує на програму мовою C. Ці перевірки менш надійні за попередні дві групи, тому їх виконують останніми. Підпрограми перевірки мов також виконують визначення файлів із сумішшю даних (зокрема архівів tar(1) та файлів JSON).
Усі файли, для яких не вдасться визначити набір символів із вказаного вище переліку, буде класифіковано як “data”.

ПАРАМЕТРИ

--apple
Наказує file вивести тип файла і код засобу створення як такі, що використані у давніх версіях MacOS. Код складається з восьми літер. Перші описують тип файла, а останні — засіб створення. Цей параметр належним чином працює лише для форматів файлів, у яких визначено виведення у стилі apple.
-b, --brief
Не дописувати назви файлів перед виведеними рядками (скорочений режим).
-C, --compile
Записати файл виведення magic.mgc, який містить попередньо оброблену версію файла або каталогу контрольних послідовностей.
-c, --checking-printout
Наказує вивести табуляцію перевірки обробленої форми файла контрольних послідовностей. Цей параметр, зазвичай, використовують у поєднанні з параметром -m для діагностики нового файла контрольних послідовностей до його встановлення.
-d
Виводить внутрішні діагностичні дані до stderr.
-E
Наказує програмі при помилках файлової системи (не знайдено файла тощо), замість звичайної обробки виведення помилки, як цього вимагає POSIX, і подальшого виконання завдань, видати повідомлення про помилку і завершити роботу.
-e, --exclude назва_тесту
Виключити перевірку із назвою назва_тесту зі списку перевірок, які призначено для визначення типу файла. Коректними назвами перевірок є такі:
apptype
EMX тип програми (лише у EMX).
ascii
Різноманітні типи текстових файлів (у цій перевірці буде зроблено спробу визначити кодування тексту, незалежно від значення параметра ‘encoding’).
encoding
Різні кодування тексту для програмних перевірок на контрольні послідовності.
tokens
Ігноровано, для зворотної сумісності.
cdf
Виводити подробиці щодо складених файлів документів (CDF).
compress
Перевіряти стиснені файли і заглядати до них.
csv
Перевіряти файли значень, які відокремлено комами (CSV).
elf
Виводить подробиці щодо файла ELF, якщо увімкнено перевірки контрольних послідовностей і виявлено контрольну послідовність elf.
json
Інспектує файли JSON (RFC-7159) шляхом перевірки їх на сумісність.
soft
Звернутися до файлів контрольних послідовностей.
tar
Інспектує файли tar шляхом перевірки контрольних сум 512 байтів у заголовка tar. Виключення цієї перевірки може надати докладніший опис вмісту, оскільки буде використано спосіб тестування за контрольними послідовностями.
text
Синонім до ‘ascii’.
--exclude-quiet
Подібний до --exclude, але ігнорує перевірки, про які не відомо file. Призначено для сумісності із застарілими версіями file.
--extension
Вивести список відокремлених символом похилої риски коректних суфіксів назви для виявленого типу файлів.
-F, --separator роздільник
Використати вказаний рядок як роздільник між назвою файла і повернутим для файла результатом. Типовим є ‘:’.
-f, --files-from файл_назв
Прочитати назви файлів, які слід інспектувати, з файла_назв (по одному файлу на рядок) перед списком аргументів. Має бути вказано або файл_назв або принаймні один аргумент із назвою файла. Якщо треба перевірити дані зі стандартного джерела вхідних даних, скористайтеся аргументом ‘-’ замість назви файлів. Будь ласка, зауважте, що файл_назв буде розгорнуто і включені до нього назви файлів буде оброблено одразу у місці, де вказано цей параметр, і перед обробкою інших параметрів. Це надає змогу обробляти декілька писків файлів із різними аргументами командного рядка в одному виклику file invocation. Таким чином, якщо ви хочете визначити роздільник, вам слід зробити це до визначення списку файлів, якось так: “-F @ -f файл_назв”, а не так: “-f файл_назв -F @”.
-h, --no-dereference
Використання цього параметра призведе до того, що програма не переходитиме за символічними посиланнями (у системах, де передбачено підтримку символічних посилань). Це типова поведінка, якщо не встановлено змінну середовища POSIXLY_CORRECT.
-i, --mime
Наказує file виводити рядки типів MIME, а не традиційніші зручні для читання записи. Отже, у такому режимі програма може виводити ‘text/plain; charset=us-ascii’ замість “ASCII text”.
--mime-type, --mime-encoding
Подібний до -i, але буде виведено лише вказані елементи.
-k, --keep-going
Не зупинятися на першому відповіднику, продовжувати обробку. Перед наступними відповідниками буде додано рядок ‘\012- ’. (Якщо ви хочете додати розрив рядка, скористайтеся параметром -r.) Взірець з контрольної послідовності, який матиме найвищу потужність (див. параметр -l), буде виведено першим.
-l, --list
Показує список взірців та їхню потужність з упорядковування за спаданням потужності magic(5), яку буде використано для встановлення відповідності (див. також параметр -k).
-L, --dereference
Використання цього параметра призведе до того, що програма переходитиме за символічними посиланнями, як при використанні подібного параметра у ls(1) (у системах, де передбачено підтримку символічних посилань). Це типова поведінка, якщо встановлено змінну середовища POSIXLY_CORRECT.
-m, --magic-file файли_контрольних_послідовностей
Вказати альтернативний список файлів і каталогів, у яких містяться дані контрольних послідовностей. Це може бути єдиний запис або список записів, які відокремлено двокрапками. Якщо поряд із файлом або каталогом буде виявлено зібраний файл контрольних послідовностей, буде використано саме його.
-N, --no-pad
Не доповнювати назви файлів так, щоб виведені дані було вирівняно.
-n, --no-buffer
Примусово очищувати stdout після перевірки кожного з файлів. Корисно, лише якщо виконується перевірка списку файлів. Параметр призначено для використання у програмах, яким потрібне виведення типу файлів з каналу даних.
-p, --preserve-date
У системах, де передбачено підтримку utime(3) або utimes(2), намагатися зберегти час доступу до аналізованих файлів, щоб змусити систему вважати, що file ніколи не виконував їхнє читання.
-P, --parameter назва=значення
Встановити різні обмеження параметрів.
Назва Типове Пояснення
bytes 1048576 максимальна кількість файлів, які слід прочитати з файла
elf_notes 256 максимальна оброблена кількість нотаток ELF
elf_phnum 2048 максимальна оброблена кількість розділів програми ELF
elf_shnum 32768 максимальна кількість оброблених розділів ELF
encoding 65536 максимальна кількість байтів, які слід вивчити для визначення кодування
indir 50 обмеження рекурсії для опосередкованих контрольних послідовностей
name 50 використовувати обмеження лічильника для контрольних назви/використання
regex 8192 обмеження на довжину для пошуків за формальним виразом
-r, --raw
Не перетворювати непридатні до друку символи на \ooo. Зазвичай, file перетворює непридатні до друку символи на їхні вісімкові представлення.
-s, --special-files
Зазвичай, file намагається читати і визначати тип файлів-аргументів, про які stat(2) повідомляє, як про звичайні файли. Таким чином, програма намагається запобігти читанню спеціальних файлів, яке може мати небажані наслідки. Якщо вказано параметр -s, file також прочитає файли аргументів, які є блоковим або символьним спеціальними файлами. Це корисно для визначення типів файлових систем даних на необроблених розділах диска, оскільки такі розділи є блоковими спеціальними файлами. Використання цього параметра також наказує file не зважати на розмір файла, про який повідомляє stat(2), оскільки у деяких системах ця функція повідомляє про нульовий розмір для необроблених розділів диска.
-S, --no-sandbox
У системах, де доступною є libseccomp (https://github.com/seccomp/libseccomp), параметр -S вимикає режим пісочниці, який типово увімкнено. Цей параметр потрібен file для виконання зовнішніх програм для розпаковування, тобто якщо вказано параметр -z і вбудовані засоби розпаковування є недоступними. У системах, де пісочниця є недоступною, цей параметр ні на що не вплине.
Зауваження: цю версію файла для Debian було зібрано без підтримки seccomp, тому це параметр не працює.
-v, --version
Вивести дані щодо версії програми і завершити роботу.
-z, --uncompress
Намагатися зазирати до стиснених файлів.
-Z, --uncompress-noreport
Намагатися зазирати до стиснених файлів, але звітувати лише про вміст, а не про стискання.
-0, --print0
Вивести нуль-символ ‘\0’ після назви файла. Добре для використання cut(1) для виведених даних. Не впливає на роздільник, який все одно буде виведено.
Якщо цей параметр вказано декілька разів, file виведе просто назву файла, потім NUL-символ, потім опис (або ERROR: text), або другий NUL-символ для кожного запису.
--help
Вивести короткий текст довідки і завершити роботу.

СЕРЕДОВИЩЕ

Змінною середовища MAGIC можна скористатися для встановлення назви типового файла контрольних послідовностей. Якщо встановлено значення цієї змінної, file не намагатиметься відкрити $HOME/.magic. file додає “.mgc” до значення цієї змінної, якщо це потрібно. Змінна середовища POSIXLY_CORRECT керує тим (у системах, де передбачено підтримку символічних посилань), чи намагатиметься file переходити за символічними посиланнями. Якщо встановлено, file переходитиме за символічними посиланнями, якщо ні — не переходитиме. Керувати цим можна також за допомогою параметрів -L і -h.

ФАЙЛИ

/usr/share/misc/magic.mgc
Типовий зібраний список контрольних послідовностей.
/usr/share/misc/magic
Каталог, у якому містяться типові файли контрольних послідовностей.

СТАН ВИХОДУ

file завершить роботу зі станом виходу 0, якщо дію було виконано успішно, або зі станом >0, якщо сталася помилка. Вказані нижче помилки призводитимуть до виведення діагностичних повідомлень, але не впливатимуть на код виходу програми (як цього вимагає POSIX), якщо не вказано параметра -E:
  • Файл не може бути знайдено
  • Немає прав доступу до читання файла
  • Тип файла не вдалося визначити

ПРИКЛАДИ

$ file file.c file /dev/{wd0a,hda} 
file.c:	  C program text 
file:	  ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
	  dynamically linked (uses shared libs), stripped 
/dev/wd0a: block special (0/0) 
/dev/hda: block special (3/0) 
 
$ file -s /dev/wd0{b,d} 
/dev/wd0b: data 
/dev/wd0d: x86 boot sector 
 
$ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10} 
/dev/hda:   x86 boot sector 
/dev/hda1:  Linux/i386 ext2 filesystem 
/dev/hda2:  x86 boot sector 
/dev/hda3:  x86 boot sector, extended partition table 
/dev/hda4:  Linux/i386 ext2 filesystem 
/dev/hda5:  Linux/i386 swap file 
/dev/hda6:  Linux/i386 swap file 
/dev/hda7:  Linux/i386 swap file 
/dev/hda8:  Linux/i386 swap file 
/dev/hda9:  empty 
/dev/hda10: empty 
 
$ file -i file.c file /dev/{wd0a,hda} 
file.c:	     text/x-c 
file:	     application/x-executable 
/dev/hda:    application/x-not-regular-file 
/dev/wd0a:   application/x-not-regular-file 

ДИВ. ТАКОЖ

hexdump(1), od(1), strings(1), magic(5)

СУМІСНІСТЬ ІЗ СТАНДАРТАМИ

Ми вважаємо, що програма перевищує System V Interface Definition of FILE(CMD), наскільки точно ми можемо визначити з наведених там нечітких визначень. Поведінка програми здебільшого сумісна з програмою з System V з такою ж назвою. Однак ця версія знає більше контрольних послідовностей, тож вона у багатьох випадках надасть інший вивід (хоч може й точніший).
Одна значна різниця між цією версією й System V це те, що ця версія опрацьовує пробільні символи, як розділювач, тож пробіли в рядках шаблонів будуть екрановані. Наприклад,
>10	string	language impress	(imPRESS data)
у наявному файлі контрольних послідовностей мало б бути змінено на
>10	string	language\ impress	(imPRESS data)
Крім того, у цій версії, якщо у рядку взірця міститься символ зворотної похилої риски, його слід екранувати. Приклад:
0	string		\begindata	Andrew Toolkit document
у наявному файлі контрольних послідовностей мало б бути змінено на
0	string		\\begindata	Andrew Toolkit document
Випуски SunOS 3.2 й пізніше від Sun Microsystems містять команду file, що є похідною від програми з System V, але з деякими розширеннями. Ця версія відрізняється від версії Sun's лише незначними деталями. Вона містить розширення оператора ‘&’, що використовується, наприклад, як
>16	long&0x7fffffff	>0		not stripped

БЕЗПЕКА

На системах з libseccomp (https://github.com/seccomp/libseccomp), file примусово встановлює обмеження системних викликів лише на ті, що необхідні для виконання програми. Це примусове встановлення не надає жодних переваг з погляду безпеки коли file запитують розтиснути вхідні файли за допомогою зовнішніх програм за допомогою параметра -z. Щоб дозволити виконання зовнішніх розпакувальників, потрібно вимкнути пісочницю за допомогою параметра -S.

КАТАЛОГ КОНТРОЛЬНИХ ПОСЛІДОВНОСТЕЙ

Записи файла контрольних послідовностей було зібрано з різних джерел, в основному, USENET, і надіслано різними авторами. Christos Zoulas (адресу наведено нижче) збиратиме додаткові та виправлені записи файла контрольних послідовностей. Періодично поширюватимуться нові версії збірки записів файлів контрольних послідовностей.
Порядок записів у файлі контрольних послідовностей має значення. Залежно від використаної вами системи, порядок, у якому їх зібрано, може бути неправильним.

ЖУРНАЛ

Команда file була частиною усіх UNIX з часу принаймні Research Version 4 (сторінка підручника датується листопадом 1973 року). У версії для System V було впроваджено одну значну зміну: зовнішній список типів контрольних послідовностей. Це дещо уповільнило роботу програми, але зробило її набагато гнучкішою.
Цю програму, засновану на версії для System V, було написано Ian Darwin ⟨[email protected]⟩ без використання будь-чийого початкового коду.
Код було суттєво переписано John Gilmore, що зробило його кращим, ніж у першій версії. Geoff Collyer виявив декілька невідповідностей та надав додаткові записи для файла контрольних послідовностей. Внесок Rob McMahon, ⟨[email protected]⟩, 1989 рік, полягає у впровадженні оператора ‘&’.
Guy Harris, ⟨[email protected]⟩, вносив багато змін від 1993 рок і аж до сучасного стану програми.
Основну частину завдань з розробки і супроводу з 1990 року до поточного моменту виконує Christos Zoulas ⟨[email protected]⟩.
Змінено Chris Lowth ⟨[email protected]⟩, 2000 рік: реалізовано обробку параметра -i для виведення рядків типів MIME, використання альтернативного файла контрольних послідовностей та змінено внутрішню логіку.
Змінено Eric Fischer ⟨[email protected]⟩, липень 2000 року, для визначення кодів символів і спроби визначити мови у файлах, відмінних від ASCII.
Змінено Reuben Thomas ⟨[email protected]⟩, 2007-2011, для удосконалення підтримки MIME, об'єднано контрольні послідовності MIME і не-MIME, реалізовано підтримку каталогів, а також файлів контрольних послідовностей, виправлено багато вад, оновлено і виправлено багато контрольних послідовностей, удосконалено систему збирання, удосконалено документацію і переписано прив'язки до Python на чистому Python.
Список учасників розробки для каталогу ‘контрольних послідовностей’ (файлів magic) є надто довгим для включення тут. Ви самі знаєте про свій внесок. Дякуємо вам. Багато учасників розробки наведено у списках у файлах початкових кодів.

ЮРИДИЧНІ ЗАУВАЖЕННЯ

Авторські права належать Ian F. Darwin, Торонто, Канада, 1986-1999. Захищено стандартними авторськими правами Berkeley Software Distribution; див. файл COPYING у дистрибутиві початкового коду.
Файли tar.h і is_tar.c було написано John Gilmore для його програми tar(1) з відкритим доступом (public domain). Цей файл не підлягає ліцензуванню за вказаною вище ліцензією.

ВАДИ

Будь ласка, повідомляйте про вади і надсилайте латки до системи стеження за вадами за адресою https://bugs.astron.com/ або до списку листування за адресою ⟨[email protected]⟩ (спочатку відвідайте https://mailman.astron.com/mailman/listinfo/file, щоб підписатися).

ЗАВДАННЯ

Виправити виведення даних так, щоб зникла потреба у перевірках прапорців MIME і APPLE в усьому коді, а виведення відбувалося лише в одному місці. Це потребує зміни компонування. Пропозиція: скласти список можливих позицій виведення, потім вибрати останнє (сподіваємося, найспецифічніше) значення наприкінці, або скористатися типовим, якщо список порожній. Зміна не повинне вплинути на швидкодію аналізу.
Обробка MAGIC_CONTINUE і виведення \012- між записами є незграбною і ускладненою; переписати і централізувати.
Частину логіки кодування жорстко вписано до encoding.c. Її можна пересунути до файлів контрольних послідовностей, якщо використовувати позначення !:набір_символів.
Продовжити виправляти усі вади в обробці контрольних послідовностей. Див. систему стеження за вадами Debian, щоб дізнатися про це більше.
Зберігати довільно довгі рядки, наприклад, для взірців %s, щоб їх можна було виводити. Виправить ваду Debian 271672. Зробити це можна розміщенням рядків у буфері рядків, збереженням буфера рядків наприкінці файла контрольних послідовностей і перетворенням усіх вказівників на рядки на відносні відступи з буфера рядків.
Додати синтаксичні конструкції для відносних відступі після поточного рівня (вада Debian 466037).
Зробити так, щоб file -ki працювало, тобто можна було вказати декілька типів MIME.
Додати бібліотеку zip, щоб можна було увійти до документів Office2007 для виведення додаткових подробиць щодо їхнього вмісту.
Додати параметр для виведення адрес для джерел описів файлів.
Поєднати пошуки скриптів та додати спосіб прив'язування назв виконуваних файлів до типів MIME (наприклад, мати значення контрольної суми для !:mime, яке спричинятиме пошук рядка-результату у таблиці). Таким чином буде усунено проблему із повторним додаванням контрольної послідовності для кожного нового інтерпретатора бінарних позначок.
Якщо доступним є дескриптор файла, ми можемо пропустити і скоригувати буфер, замість складного керування буфером, яке виконується зараз.
Виправити “name” і “use” для перевірки сумісності під час збирання (дублювання “name”, “use”, що вказує на невизначене “name” ). Зробити “name” / “use” ефективнішим шляхом зберігання упорядкованого списку назв. Особливий випадок ^ для зміни порядку байтів в обробнику так, щоб не було потреби в екранування, і документування нових можливостей.
Якщо відступи, які вказано на внутрішньому рівні у файлі, перевищують розмір буфера (значення змінної HOWMANY у file.h), позиціювання за відступом виконано не буде. Було б краще виконувати керування буфером при доступності дескриптора файла, щоб можна було виконувати позиціювання у файлі. Втім, слід бути обережними, оскільки це може торкнутися питань швидкодії і безпеки, оскільки роботу програми може бути уповільнено повторними позиціюваннями.
Маємо підтримку зберігання окремих буферів та відступів з кінця файла, але внутрішнє керування буфером усе ще потребує значної переробки.

ДОСТУПНІСТЬ

Ви можете отримати найсвіжішу версію від самого автора з анонімного FTP за адресою ftp.astron.com у каталозі /pub/file/file-X.YZ.tar.gz.

ПЕРЕКЛАД

Український переклад цієї сторінки посібника виконано Andriy Rysin <[email protected]> і Yuri Chornoivan <[email protected]>
Цей переклад є безкоштовною документацією; будь ласка, ознайомтеся з умовами GNU General Public License Version 3. НЕ НАДАЄТЬСЯ ЖОДНИХ ГАРАНТІЙ.
Якщо ви знайшли помилки у перекладі цієї сторінки підручника, будь ласка, надішліть електронний лист до списку листування перекладачів: [email protected]

Recommended readings

Pages related to file you should read also: