FILE(1) | General Commands Manual | FILE(1) |
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
-c
,
--checking-printout
-m
для
діагностики
нового
файла
контрольних
послідовностей
до його
встановлення.-d
-E
-e
,
--exclude
назва_тестуEMX
тип
програми
(лише у EMX).--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
-r
.)
Взірець з
контрольної
послідовності,
який
матиме
найвищу
потужність
(див.
параметр
-l
), буде
виведено
першим.-l
,
--list
-k
).-L
,
--dereference
POSIXLY_CORRECT
.-m
,
--magic-file
файли_контрольних_послідовностей-N
,
--no-pad
-n
,
--no-buffer
-p
,
--preserve-date
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
file
перетворює
непридатні
до друку
символи на
їхні
вісімкові
представлення.-s
,
--special-files
file
намагається
читати і
визначати
тип
файлів-аргументів,
про які
stat(2)
повідомляє,
як про
звичайні
файли.
Таким
чином,
програма
намагається
запобігти
читанню
спеціальних
файлів, яке
може мати
небажані
наслідки.
Якщо
вказано
параметр
-s
, file
також
прочитає
файли
аргументів,
які є
блоковим
або
символьним
спеціальними
файлами. Це
корисно
для
визначення
типів
файлових
систем
даних на
необроблених
розділах
диска,
оскільки
такі
розділи є
блоковими
спеціальними
файлами.
Використання
цього
параметра
також
наказує
file
не
зважати на
розмір
файла, про
який
повідомляє
stat(2),
оскільки у
деяких
системах
ця функція
повідомляє
про
нульовий
розмір для
необроблених
розділів
диска.-S
,
--no-sandbox
-S
вимикає
режим
пісочниці,
який
типово
увімкнено.
Цей
параметр
потрібен
file
для
виконання
зовнішніх
програм
для
розпаковування,
тобто якщо
вказано
параметр
-z
і
вбудовані
засоби
розпаковування
є
недоступними.
У системах,
де
пісочниця
є
недоступною,
цей
параметр
ні на що не
вплине.
Зауваження: цю версію файла для Debian було зібрано без підтримки seccomp, тому це параметр не працює.
-v
,
--version
-z
,
--uncompress
-Z
,
--uncompress-noreport
-0
,
--print0
Якщо цей
параметр
вказано
декілька
разів, file
виведе
просто
назву
файла,
потім
NUL-символ,
потім
опис (або ERROR: text),
або
другий
NUL-символ
для
кожного
запису.
--help
Змінною
середовища
MAGIC
можна
скористатися
для
встановлення
назви
типового
файла
контрольних
послідовностей.
Якщо
встановлено
значення
цієї
змінної,
file
не
намагатиметься
відкрити
$HOME/.magic. file
додає
“.mgc” до
значення
цієї
змінної,
якщо це
потрібно.
Змінна
середовища
POSIXLY_CORRECT
керує тим (у
системах,
де
передбачено
підтримку
символічних
посилань),
чи
намагатиметься
file
переходити
за
символічними
посиланнями.
Якщо
встановлено,
file
переходитиме
за
символічними
посиланнями,
якщо ні — не
переходитиме.
Керувати
цим можна
також за
допомогою
параметрів
-L
і -h
.
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
Ми вважаємо, що програма перевищує 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 ⟨ian@darwinsys.com⟩ без використання будь-чийого початкового коду.
Код було суттєво переписано John Gilmore, що зробило його кращим, ніж у першій версії. Geoff Collyer виявив декілька невідповідностей та надав додаткові записи для файла контрольних послідовностей. Внесок Rob McMahon, ⟨cudcv@warwick.ac.uk⟩, 1989 рік, полягає у впровадженні оператора ‘&’.
Guy Harris, ⟨guy@netapp.com⟩, вносив багато змін від 1993 рок і аж до сучасного стану програми.
Основну частину завдань з розробки і супроводу з 1990 року до поточного моменту виконує Christos Zoulas ⟨christos@astron.com⟩.
Змінено Chris
Lowth ⟨chris@lowth.com⟩, 2000 рік:
реалізовано
обробку
параметра
-i
для
виведення
рядків
типів MIME,
використання
альтернативного
файла
контрольних
послідовностей
та змінено
внутрішню
логіку.
Змінено Eric Fischer ⟨enf@pobox.com⟩, липень 2000 року, для визначення кодів символів і спроби визначити мови у файлах, відмінних від ASCII.
Змінено Reuben Thomas ⟨rrt@sc3d.org⟩, 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/ або до списку листування за адресою ⟨file@astron.com⟩ (спочатку відвідайте 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 <arysin@gmail.com> і Yuri Chornoivan <yurchor@ukr.net>
Цей переклад є безкоштовною документацією; будь ласка, ознайомтеся з умовами GNU General Public License Version 3. НЕ НАДАЄТЬСЯ ЖОДНИХ ГАРАНТІЙ.
Якщо ви знайшли помилки у перекладі цієї сторінки підручника, будь ласка, надішліть електронний лист до списку листування перекладачів: trans-uk@lists.fedoraproject.org
26 жовтня 2022 року | Debian |