Você pode escrever um script que chama file
e usar uma declaração de caso para verificar os casos nos quais está interessado.
Por exemplo
#!/bin/sh
case $(file "$1") in
(*script*|*\ text|*\ text\ *)
echo text
;;
(*)
echo binary
;;
esac
embora, é claro, possa haver muitos casos especiais de interesse. Apenas checandostrings
uma cópia libmagic
, vejo cerca de 200 casos, por exemplo,
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
Alguns usam a string "text" como parte de um tipo diferente, por exemplo,
SoftQuad troff Context intermediate
SoftQuad troff Context intermediate for AT&T 495 laser printer
SoftQuad troff Context intermediate for HP LaserJet
da mesma forma script
poderia ser parte de uma palavra, mas não vejo problemas neste caso. Mas um script deve verificar "text"
como uma palavra , não como uma substring .
Como lembrete, a file
saída não usa uma descrição precisa que sempre teria "script" ou "texto". Casos especiais são algo a considerar. Um acompanhamento comentou que os --mime-type
trabalhos, embora essa abordagem não funcionasse, para .svg
arquivos. No entanto, em um teste, vejo estes resultados para arquivos 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
que eu selecionei depois de ver milhares de arquivos mostrar apenas 6 com "texto" na saída do tipo MIME. Indiscutivelmente, combinar o "xml" no final da saída do tipo MIME poderia ser mais útil, digamos, do que combinar o "SVG", mas usar um script para fazer isso leva você de volta à sugestão feita aqui.
A saída de file
requer algum ajuste em qualquer cenário e não é 100% confiável (é confundida por vários dos meus scripts Perl, chamando-os de "dados").
Existe mais de uma implementação de file
. O mais usado faz seu trabalho libmagic
, que pode ser usado em diferentes programas (talvez não diretamente zsh
, emborapython
possa).
De acordo com a tabela de comparação de teste de arquivo para shell, Perl, Ruby e Python , o Perl tem um-T
opção que pode ser usada para fornecer essas informações. Mas ele não lista nenhum recurso comparável para zsh
.
Leitura adicional:
file
é um utilitário padrão e pode executar a mágica de arquivos para determinar os tipos de arquivos da melhor maneira possível. Ele sabe a maioria dos formatos de texto e faz um trabalho bastante decente em formatos binários. Se tudo que você está tentando fazer é descobrir se um arquivo é de texto ou não, isso é o comando que você está interessado.