Komenda pliku systemu Linux klasyfikująca pliki


17

Muszę rozpoznać rodzaj danych zawartych w losowych plikach. Jestem nowy w Linuksie.

Planuję użyć filepolecenia, aby zrozumieć, jaki typ danych ma plik. Próbowałem tego polecenia i otrzymałem wynik poniżej.

Ktoś zasugerował mi, że filepolecenie sprawdza początkowe bajty pliku, aby określić typ danych. filePolecenie nie patrzeć na rozszerzenie pliku w ogóle. Czy to jest poprawne? Spojrzałem na stronę podręcznika, ale czułem, że jest zbyt techniczna. Byłbym wdzięczny, gdyby ktoś mógł podać link, który ma znacznie prostsze wyjaśnienie dotyczące działania filepolecenia.

Jakie są różne możliwe odpowiedzi, które można uzyskać po uruchomieniu filepolecenia? Na przykład w poniższym transkrypcie otrzymuję JPEG, ISO media, ASCII itp .:

Dane wyjściowe ekranu są następujące

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


Aktualizacja 1

Dzięki za odpowiedzi i wyjaśnili mi kilka rzeczy.

Więc jeśli dobrze rozumiem, folder / usr / share / mime / magic ma bazę danych, która da mi jakie są obecnie możliwe formaty plików (wyniki, które mogę uzyskać, gdy wpisuję polecenie file i podążam za nim po pliku). czy to jest poprawne? Czy to prawda, że ​​ilekroć polecenie „Plik” zawiera słowo „tekst”, odnosi się do czegoś, co można odczytać za pomocą przeglądarki tekstu, a wszystko bez „tekstu” jest rodzajem pliku binarnego?


6
W przyszłości opublikowanie obrazu wyjścia terminala naprawdę nie jest zalecane (ani nie cieszy go nikt). Użyj formatowania bloków kodu przeceny.
HalosGhost,

3
Usunąłem zdjęcie i opublikowałem kod.
user2543622,

Uwaga: jeśli plik nie może zidentyfikować pliku, często może to zrobić TrID . ma własną bazę danych charakterystycznych dla plików, stworzoną przez społeczność, która go używa.
Josef mówi Przywróć Monikę

Odpowiedzi:


13

file wykorzystuje kilka rodzajów testów :

1: Jeżeli plik nie istnieje, nie można go odczytać lub nie można określić jego statusu, wynik wskazuje, że plik został przetworzony, ale nie można określić jego typu.

To będzie wyjście jak cannot open file: No such file or directory.

2: Jeżeli plik nie jest zwykłym plikiem, należy zidentyfikować jego typ. Katalog typów plików, FIFO, gniazdo, blok specjalny i znak specjalny są identyfikowane jako takie. Można również zidentyfikować inne typy plików zdefiniowane w implementacji. Jeśli plik jest dowiązaniem symbolicznym, domyślnie dowiązanie zostanie rozwiązane, a plik przetestuje typ pliku, do którego odwołuje się dowiązanie symboliczne. (Zobacz opcje -hi -iponiżej.)

To będzie wyjście jak .: directoryi /dev/sda: block special. Znaczna część formatu tego i poprzedniego punktu jest częściowo zdefiniowana przez POSIX - możesz polegać na pewnych ciągach znajdujących się na wyjściu.

3: Jeżeli długość pliku wynosi zero, należy go zidentyfikować jako pusty plik.

Jest foo: empty.

4: Narzędzie do analizy plików sprawdza początkowy segment pliku i zgaduje, jak rozpoznać jego zawartość na podstawie testów uwzględniających położenie. (Nie ma gwarancji, że odpowiedź jest poprawna; zobacz opcje -d, -M i -m poniżej.)

5: Narzędzie do analizy plików sprawdza plik i zgaduje, jak rozpoznać jego zawartość na podstawie domyślnych testów systemowych kontekstowych. (Odpowiedź nie jest poprawna).

Obaj używają identyfikacji magicznej liczby i są najciekawszą częścią polecenia. Magiczna liczba to specjalny ciąg bajtów, które znajduje się w znanym miejscu w pliku, który identyfikuje jej rodzaju. Tradycyjnie to miejsce jest pierwszymi dwoma bajtami, ale termin został rozszerzony o dłuższe ciągi znaków i inne lokalizacje. Zobacz to drugie pytanie, aby uzyskać więcej informacji na temat magicznych liczb w filepoleceniu.

fileKomenda posiada bazę tych numerów i jakie one odpowiadać; baza danych jest zwykle w niej /usr/share/mime/magici mapuje zawartość pliku na typy MIME . Wyjście tam (często część, file -ijeśli domyślnie go nie otrzymujesz) będzie zdefiniowanym typem nośnika lub rozszerzeniem. „Testy kontekstowe” wykorzystują to samo podejście, ale są nieco bardziej niepewne. Żadne z nich nie ma gwarancji, że mają rację, ale mają na celu zgadywanie.

fileposiada również bazę danych mapującą te typy na nazwy, dzięki którym będzie wiedział, że zidentyfikowany przez siebie plik application/pdfmożna opisać jako PDF document. Te czytelne dla człowieka nazwy mogą być zlokalizowane również w innym języku. Zawsze będzie to ogólny opis typu pliku w sposób zrozumiały dla danej osoby, a nie maszyna.

Większość różnych wyników, które można uzyskać, pochodzi z tych etapów. W magicpliku można znaleźć listę obsługiwanych typów i sposób ich identyfikacji - mój system zna 376 różnych typów. Podane nazwy i obsługiwane typy są określone przez opakowanie i konfigurację systemu, więc system może obsługiwać więcej lub mniej niż moje, ale na ogół jest ich dużo. libmagiczawiera także dodatkowe zakodowane testy.

6: Plik należy zidentyfikować jako plik danych.

Dzieje się tak foo: data, gdy w ogóle nie można dowiedzieć się o pliku.

Istnieją również inne małe tagi, które mogą się pojawić. Plik wykonywalny ( +x) będzie zawierać wynik „ executable”, zwykle oddzielony przecinkami. fileRealizacja może również wiedzieć, niektóre rzeczy o niektórych formatów plików, aby móc opisać dodatkowe punkty o nich, jak w swoim „ PDF document, version 1.4”.


8

Strony podręcznika są zwykle zwięzłe, a nie wstępami. Zacznij od strony Wikipedii .

filepatrzy tylko na zawartość pliku, a nie na nazwę pliku. (Przygląda się także niektórym metadanym pliku, takim jak typ pliku: katalog, symboliczny link, nazwany potok itp. Ale w przypadkach, które Cię interesują, liczy się treść.)

filezazwyczaj zgaduje format pliku, patrząc na kilka pierwszych bajtów i porównując je z wbudowaną tabelą magicznych liczb . Na przykład, jeśli plik zaczyna się od %PDF, to filezgłasza „dokument PDF” (i kopie dalej, aby zgłosić minimalną wersję). W przypadku typów plików, które nie zaczynają się od magicznych liczb, zawiera heurystykę, np. Zgłasza „tekst ASCII”, jeśli pierwsze kilka bajtów znajduje się w drukowanym zakresie ASCII.

Wynik działania filejest kruchy: może różnić się w zależności od wariantu uniksowego do wariantu uniksowego i od wersji do wersji. W systemach Linux, Cygwin i * BSD filepolecenie obsługuje opcję, -iktóra generuje przewidywalne dane wyjściowe w postaci typu nośnika MIME (IANA zarządza listą standardowych typów nośników ). Nie ma tak wielu szczegółów, a wynik jest mniej przyjazny dla człowieka, ale wynik jest przewidywalny i przyjazny dla komputera.

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

Użyj, file --mime-typejeśli chcesz tylko sam typ MIME bez informacji o kodowaniu, np application/pdf. Przekaż opcję, -bjeśli nie chcesz wyświetlać nazwy pliku na początku wiersza.


5

Chciałbym, żebyś przeczytał odpowiedź stąd . Niektóre fragmenty odpowiedzi to:

Ze strony man filepolecenia

file polecenie faktycznie wykonuje 3 testy określające typ pliku.

Pierwszy test

Testy systemu plików opierają się na sprawdzeniu zwrotu z wywołania systemowego stat (2).

Drugi test

Testy magicznej liczby służą do sprawdzania plików z danymi w określonych stałych formatach.

Trzeci test

Testy językowe szukają określonych ciągów (por. Names.h), które mogą pojawić się w dowolnym miejscu w pierwszych kilku blokach pliku. Na przykład słowo kluczowe .br wskazuje, że plik jest najprawdopodobniej plikiem wejściowym troff (1), podobnie jak słowo kluczowe struct wskazuje program C.

Dane wyjściowe file polecenia są generalnie oparte na wynikach dowolnego testu, który się powiedzie.

Teraz, zakładając, że program C ++ zaczyna się tak, a trzeci test się powiedzie,

#include <iostream.h>
bla
bla

W trzecim teście słowo kluczowe w #includeszczególności określa, że ​​jest to program typu C , chociaż mamy pod ręką program CPP . Teraz kiedy sprawdzę

$ file example.cpp

example.cpp: ASCII C program text

Teraz pojęcia obiektowe są specyficzne dla C ++. Utwórzmy plik specyficzny dla C ++ .

Zaczynam mój program C ++ jako,

Class something
{
}
bla
bla

Teraz kiedy wydam

$ file example.cpp

Dane wyjściowe to

example.cpp: ASCII C++ program text

To w zasadzie wyjaśnia, w jaki sposób filepolecenie działa na podobnych plikach (w tym przykładzie programy C i C ++ są traktowane podobnie, chyba że użyjemy funkcji obiektowych specyficznych dla C ++).


1

Gilles i Michael Homer udzielili doskonałych odpowiedzi. do którego cię odsyłam. Aby zobaczyć typy plików rozpoznawanych w systemie, spróbuj uruchomić

cat /usr/share/magic

Jeśli daje to problemy z uprawnieniami lub nie istnieje, być może

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(może wymagać dostosowania w zależności od systemu), który powinien wyświetlić listę typów plików w systemie. Uruchomienie tego polecenia może zająć dużo czasu, w zależności od rozmiaru głównego systemu plików.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.