Ви можете написати скрипт, який викликає дзвінки file
, і використовувати випадок справи, щоб перевірити, чи цікавлять вас справи.
Наприклад
#!/bin/sh
case $(file "$1") in
(*script*|*\ text|*\ text\ *)
echo text
;;
(*)
echo binary
;;
esac
хоча, звичайно, може бути багато спеціальних випадків, які представляють інтерес. Перевіряючи strings
копію libmagic
, я бачу близько 200 випадків, наприклад,
Konqueror cookie text
Korn shell script text executable
LaTeX 2e document text
LaTeX document text
Linux Software Map entry text
Linux Software Map entry text (new format)
Linux kernel symbol map text
Lisp/Scheme program text
Lua script text executable
LyX document text
M3U playlist text
M4 macro processor script text
Деякі використовують рядок "текст" як частину іншого типу, наприклад,
SoftQuad troff Context intermediate
SoftQuad troff Context intermediate for AT&T 495 laser printer
SoftQuad troff Context intermediate for HP LaserJet
так само script
може бути частиною слова, але я не бачу проблем у цьому випадку. Але сценарій повинен перевіряти "text"
як слово , а не підрядку .
Як нагадування, у file
висновку не використовується точний опис, який завжди мав би "скрипт" або "текст". Особливі випадки є чим розглянути. Наступний коментар прокоментував, що --mime-type
для .svg
файлів працює, хоча такого підходу не буде . Однак у тесті я бачу ці результати для svg-файлів:
$ ls -l *.svg
-r--r--r-- 1 tom users 6679 Jul 26 2012 pumpkin_48x48.svg
-r--r--r-- 1 tom users 17372 Jul 30 2012 sink_48x48.svg
-r--r--r-- 1 tom users 5929 Jul 25 2012 vile_48x48.svg
-r--r--r-- 1 tom users 3553 Jul 28 2012 vile-mini.svg
$ file *.svg
pumpkin_48x48.svg: SVG Scalable Vector Graphics image
sink_48x48.svg: SVG Scalable Vector Graphics image
vile-mini.svg: SVG Scalable Vector Graphics image
vile_48x48.svg: SVG Scalable Vector Graphics image
$ file --mime-type *.svg
pumpkin_48x48.svg: image/svg+xml
sink_48x48.svg: image/svg+xml
vile-mini.svg: image/svg+xml
vile_48x48.svg: image/svg+xml
який я вибрав, побачивши тисячу файлів, на виході mime-типу відображається лише 6 з "текстом". Можливо, відповідність "xml" на кінці виводу типу mime може бути кориснішим, скажімо, порівнянням зі "SVG", але використання сценарію для цього повертає вас до запропонованої тут пропозиції.
Вихід file
вимагає певної настройки в будь-якому сценарії і не є на 100% надійним (його плутають декілька моїх скриптів Perl, називаючи їх "даними").
Існує більше ніж одна реалізація file
. Найчастіше використовується той libmagic
, який використовується в різних програмах (можливо, безпосередньо не з zsh
, хоча python
може).
Відповідно до таблиці порівняння тестів файлів для оболонок, Perl, Ruby та Python , Perl має -T
параметр, який він може використовувати для надання цієї інформації. Але в ньому перераховано порівняльну функцію zsh
.
Подальше читання:
file
є стандартною утилітою і може запускати файлову магію для визначення типів файлів, наскільки це можливо. Він може розказувати більшість текстових форматів і виконує досить гідну роботу у бінарних форматах. Якщо все, що ви намагаєтеся зробити, це з’ясувати, чи є файл текстовим чи ні, це команда, яка вас цікавить.