Muszę rozpoznać rodzaj danych zawartych w losowych plikach. Jestem nowy w Linuksie.
Planuję użyć file
polecenia, aby zrozumieć, jaki typ danych ma plik. Próbowałem tego polecenia i otrzymałem wynik poniżej.
Ktoś zasugerował mi, że file
polecenie sprawdza początkowe bajty pliku, aby określić typ danych. file
Polecenie 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 file
polecenia.
Jakie są różne możliwe odpowiedzi, które można uzyskać po uruchomieniu file
polecenia? 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?
źródło
Odpowiedzi:
file
wykorzystuje kilka rodzajów testów :To będzie wyjście jak
cannot open file: No such file or directory
.To będzie wyjście jak
.: directory
i/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.Jest
foo: empty
.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
file
poleceniu.file
Komenda posiada bazę tych numerów i jakie one odpowiadać; baza danych jest zwykle w niej/usr/share/mime/magic
i mapuje zawartość pliku na typy MIME . Wyjście tam (często część,file -i
jeś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.file
posiada również bazę danych mapującą te typy na nazwy, dzięki którym będzie wiedział, że zidentyfikowany przez siebie plikapplication/pdf
można opisać jakoPDF 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
magic
pliku 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.libmagic
zawiera także dodatkowe zakodowane testy.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.file
Realizacja 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
”.źródło
Strony podręcznika są zwykle zwięzłe, a nie wstępami. Zacznij od strony Wikipedii .
file
patrzy 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ść.)file
zazwyczaj 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
, tofile
zgł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
file
jest 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 * BSDfile
polecenie obsługuje opcję,-i
któ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.Użyj,
file --mime-type
jeśli chcesz tylko sam typ MIME bez informacji o kodowaniu, npapplication/pdf
. Przekaż opcję,-b
jeśli nie chcesz wyświetlać nazwy pliku na początku wiersza.źródło
Chciałbym, żebyś przeczytał odpowiedź stąd . Niektóre fragmenty odpowiedzi to:
Ze strony man
file
poleceniafile
polecenie faktycznie wykonuje 3 testy określające typ pliku.Pierwszy test
Drugi test
Trzeci test
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,
W trzecim teście słowo kluczowe w
#include
szczególności określa, że jest to program typu C , chociaż mamy pod ręką program CPP . Teraz kiedy sprawdzęTeraz pojęcia obiektowe są specyficzne dla C ++. Utwórzmy plik specyficzny dla C ++ .
Zaczynam mój program C ++ jako,
Teraz kiedy wydam
Dane wyjściowe to
To w zasadzie wyjaśnia, w jaki sposób
file
polecenie 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 ++).źródło
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ć
Jeśli daje to problemy z uprawnieniami lub nie istnieje, być może
(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.
źródło