Nie ma różnicy między plikiem binarnym a plikiem tekstowym w systemie Linux. Narzędzie file
sprawdza zawartość i domysły. Niestety, nie jest to zbyt pomocne, ponieważ file
nie tworzy prostej odpowiedzi "binarnej lub tekstowej"; ma złożony wynik z dużą liczbą przypadków, które musiałbyś przeanalizować.
Jednym ze sposobów jest odczytanie stałego przedrostka pliku, np. 256 bajtów, a następnie zastosowanie heurystyki. Na przykład, czy wszystkie wartości bajtów od 0x0 do 0x7F, unikając kodów kontrolnych, z wyjątkiem zwykłych białych znaków? To sugeruje ASCII? Jeśli istnieją bajty od 0x80 do 0xFF, czy cały bufor (z wyjątkiem jednego kodu na końcu, który może być przycięty) dekoduje jako prawidłowy kod UTF-8? Itd.
Jednym z pomysłów może być podstępne wykorzystywanie narzędzi wykrywających pliki binarne, takie jak GNU diff
.
$ diff -r /bin/ls <(echo foo)
Binary files /bin/ls and /dev/fd/63 differ
Bez substytucji procesowej, nadal działa:
$ diff -r /bin/ls /dev/null
Binary files /bin/ls and /dev/null differ
Teraz tylko grep wyjście to i szukać słowa Binary
.
Pytanie brzmi, czy heurystyka diff
dla plików binarnych działa dla twoich celów.
Jak o pliku tekstowym UTF-8? Policzyć to jako plik binarny? – PasteBT
Zgodnie z konwencją pliki binarne wykonywalne nie mają rozszerzeń. – jordanm
@jordanm Poza tym gwiazdorem i byciem w śmiałym kolorze. * duck * :) – Kaz