Verifique el archivo ASCII con el comando de archivo mediante shell script

5

Con el comando de archivo necesito verificar muchos archivos si son ASCII u otro formato

A veces me sale del comando de archivo:

  file1: ASCII English text

Y a veces me sale diferente respuesta de comando de archivo

  file2: Non-ISO extended-ASCII English text, with very long lines

Realmente no estoy seguro de si hay otras respuestas con diferente sintaxis

Mi pregunta es:

Escribo la siguiente sintaxis ksh para verificar si el archivo es un ASCII pero no estoy seguro de si

¿La siguiente sintaxis es la sintaxis óptima para verificar el formato ASCII?

   [[ ` file  $some_file | grep –c ASCII ` = 1 ]] && print "you have ascii file for sure"

Si alguien tiene otra sugerencia para verificar el formato ASCII, estoy seguro de que

jennifer
fuente
ASCII? ¿En los días de internet y unicode? Usted debe estar bromeando.
grawity
Te das cuenta de que file Es una suposición heurística y no una garantía, ¿verdad? yes | head -c $((2**20)) > blah; dd if=/dev/urandom bs=1 count=1024 >> blah; file blah dice blah: ASCII text aunque no lo sea.
ephemient
Sí, lo entiendo, pero ¿qué debo hacer si quiero seleccionar el tipo de archivos, qué es lo mejor que puedo hacer? , ¿alguna idea?
jennifer

Respuestas:

8
if LC_ALL=C grep -q '[^[:print:][:space:]]' file; then
    echo "file contains non-ascii characters"
else
    echo "file contains ascii characters only"
fi
ephemient
fuente
hola efímero: explica LC_ALL = C antes del comando grep, ¿por qué?
jennifer
2
LC_ALL=C efectivo grep para tratar [[:print:]] como la clase de caracteres "ASCII imprimible". De lo contrario, significa "imprimible & lt; sea cual sea su configuración regional actual & gt;", que puede no ser ASCII. Por ejemplo, la mayoría de los cuadros de Linux están configurados con las configuraciones regionales UTF-8, en cuyo caso [[:print:]] coincidiría con las secuencias de caracteres no ASCII que son caracteres imprimibles en UTF-8 válidos.
ephemient
1
@jennifer: name=value command es la sintaxis para configurar temporalmente una variable de entorno, en este caso LC_ALL, por un solo comando. Estableciendo locale a C se asegura [[:print:]] solo coincide con caracteres ASCII (y no con caracteres acentuados de su idioma).
grawity
¿por qué recibo "el archivo contiene caracteres no-ascii" para / etc / hosts, como saben que el archivo hosts es un archivo ASCII?
jennifer
@jennifer: Corregido. Probablemente incluyó una pestaña o algo así; olvidé [[:print:]] es [[:graph:] ] no [[:graph:][:space:]].
ephemient
1

Qué tal si...

if file -ib "$file" | grep -Eqs '^text/plain(;|$)'; then
    echo "It's text/plain."
fi

No se que tan comun es --mime-type; si es standard, usa

if file -b --mime-type "$file" | grep -qs '^text/plain$'; then

Alternativamente grep -qs '^text/' para cualquier tipo de texto.

grawity
fuente
0

Ya que está analizando la salida con el código, sugeriría usar el -i opción en file por lo que produce MÍMICA tipos en lugar de cuerdas amigables con los humanos. La salida de tipo MIME es más regular y eso hace que sea un poco más fácil tratar con el código.

En cuanto a los tipos de salida, un vistazo a archivo de hombre dice que:

/usr/share/file/magic
    Default list of magic numbers

/usr/share/file/magic.mime
    Default list of magic numbers, used to output  mime types
    when the -i option is specified.

Eche un vistazo a esos archivos para todos los tipos MIME que puede informar para determinar qué tipos le importarán al analizar la salida file. Sospecho que todo lo que te importa es que el tipo MIME comienza con text/.

Ian C.
fuente