Non c'è differenza tra un file binario e un file di testo su Linux. L'utilità file
esamina i contenuti e le ipotesi. Sfortunatamente, non è di grande aiuto perché file
non produce una semplice risposta "binaria o di testo"; ha un output complesso con un numero elevato di casi che dovresti analizzare.
Un approccio consiste nel leggere alcuni prefissi di dimensioni fisse di un file, ad esempio 256 byte, e quindi applicare delle euristiche. Ad esempio, sono tutti i valori di byte da 0x0 a 0x7F, evitando i codici di controllo ad eccezione degli spazi bianchi comuni? Questo suggerisce ASCII? Se ci sono byte da 0x80 a 0xFF, l'intero buffer (ad eccezione di un codice alla fine che può essere troncato) decodifica come UTF-8 valido? Etc.
Un'idea potrebbe essere quella di sfruttare di nascosto le utilità che rilevano file binari, come GNU diff
.
$ diff -r /bin/ls <(echo foo)
Binary files /bin/ls and /dev/fd/63 differ
Senza sostituzione di processo, funziona ancora:
$ diff -r /bin/ls /dev/null
Binary files /bin/ls and /dev/null differ
Ora basta grep l'output di questo e cercare la parola Binary
.
La domanda è se l'euristica diff
per i file binari funziona per i propri scopi.
Come su file di testo codifica UTF-8? Conta come un file binario? – PasteBT
Per convenzione, i file binari eseguibili non hanno estensioni. – jordanm
@jordanm Oltre a quella cosa stellare, e in un colore audace. * duck * :) – Kaz