Puede escribir un script que llame file
y usar una declaración de caso para verificar los casos que le interesan.
Por ejemplo
#!/bin/sh
case $(file "$1") in
(*script*|*\ text|*\ text\ *)
echo text
;;
(*)
echo binary
;;
esac
aunque, por supuesto, puede haber muchos casos especiales que sean de interés. Solo comprobando strings
una copia de libmagic
, veo unos 200 casos, por ejemplo,
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
Algunos usan la cadena "texto" como parte de un tipo diferente, por ejemplo,
SoftQuad troff Context intermediate
SoftQuad troff Context intermediate for AT&T 495 laser printer
SoftQuad troff Context intermediate for HP LaserJet
igualmente script
podría ser parte de una palabra, pero no veo problemas en este caso. Pero una secuencia de comandos debe comprobar "text"
como una palabra , no una subcadena .
Como recordatorio, la file
salida no utiliza una descripción precisa que siempre tenga "script" o "text". Los casos especiales son algo a considerar. Un seguimiento comentó que --mime-type
funciona mientras que este enfoque no lo haría, para los .svg
archivos. Sin embargo, en una prueba veo estos resultados para archivos 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 seleccioné después de ver que mil archivos muestran solo 6 con "texto" en la salida de tipo mime. Podría decirse que hacer coincidir el "xml" al final de la salida de tipo mime podría ser más útil, por ejemplo, que hacer coincidir "SVG", pero usar un script para hacerlo lo lleva de vuelta a la sugerencia que se hace aquí.
El resultado de file
requiere un poco de ajuste en cualquier escenario, y no es 100% confiable (varios de mis scripts de Perl lo confunden, llamándolos "datos").
Hay más de una implementación de file
. El que se usa más comúnmente hace su trabajo libmagic
, que puede usarse desde diferentes programas (quizás no directamente desde zsh
, aunque python
puede).
De acuerdo con la tabla de comparación de pruebas de archivos para shell, Perl, Ruby y Python , Perl tiene una -T
opción que puede usar para proporcionar esta información. Pero no enumera ninguna característica comparable para zsh
.
Otras lecturas:
file
es una utilidad estándar y puede ejecutar la magia de archivos para determinar los tipos de archivos lo mejor que pueda. Puede indicar la mayoría de los formatos de texto y hace un trabajo bastante decente en formatos binarios. Si todo lo que intenta hacer es averiguar si un archivo es texto o no, ese es el comando que le interesa.