Вы можете написать скрипт, который вызывает file
, и использовать оператор case для проверки интересующих вас случаев.
Например
#!/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
который я выбрал, увидев тысячу файлов, показывающих только 6 с текстом в выводе mime-типа. Возможно, сопоставление «xml» в конце вывода mime-типа может быть более полезным, скажем, чем сопоставление «SVG», но использование сценария для выполнения этого возвращает вас к предложению, сделанному здесь.
Вывод file
требует некоторой настройки в любом сценарии и не является на 100% надежным (его смущают несколько моих сценариев Perl, называющих их «данные»).
Существует более одной реализации file
. Наиболее часто используемая выполняет свою работу libmagic
, которую можно использовать из разных программ (возможно, не напрямую zsh
, хотя python
можно).
Согласно таблице сравнения тестов файлов для оболочки, Perl, Ruby и Python , в Perl есть -T
опция, которую он может использовать для предоставления этой информации. Но это не перечисляет сопоставимую функцию для zsh
.
Дальнейшее чтение:
file
это стандартная утилита, которая может использовать магию файлов для определения типов файлов в меру своих возможностей. Он может распознавать большинство текстовых форматов и довольно неплохо справляется с двоичными форматами. Если все, что вы пытаетесь сделать, это выяснить, является ли файл текстовым или нет, это команда, которая вас интересует.