Chciałbym wiedzieć, jak znane są typy plików, jeśli nazwy plików nie mają sufiksów.
Na przykład plik o nazwie myfile
może być binarny lub tekstowy na początek, skąd system wie, czy plik jest binarny czy tekstowy?
files
filesystems
mime-types
file-opening
Niklas Rosencrantz
źródło
źródło
Odpowiedzi:
file
Narzędzie określa typ pliku w ciągu 3 sposoby:Najpierw testy systemu plików : w ramach tych testów na pliku wywoływane jest jedno z wywołań systemowych rodziny stat . Zwraca różne typy plików unix : zwykły plik, katalog, link, urządzenie znakowe, urządzenie blokowe, nazwany potok lub gniazdo. W zależności od tego wykonywane są magiczne testy.
Te magiczne testy są nieco bardziej skomplikowane. Typy plików są odgadywane przez bazę wzorów zwaną plikiem magicznym . Niektóre typy plików można określić, odczytując bit lub liczbę w określonym miejscu pliku (na przykład pliki binarne). Plik magiczny zawiera „ magiczne liczby ”, aby przetestować plik, czy go zawiera, czy nie i które informacje tekstowe powinny zostać wydrukowane. Te „ magiczne liczby ” mogą być 1-4 bajtowymi wartościami, łańcuchami, datami, a nawet wyrażeniami regularnymi. Przy dalszych testach można znaleźć dodatkowe informacje. W przypadku pliku wykonywalnego dodatkową informacją byłoby to, czy jest dynamicznie połączone, czy nie, pozbawioneczy nie, czy architektura. Czasami wiele testów musi przejść pomyślnie, aby typ pliku mógł zostać naprawdę zidentyfikowany. Ale tak czy inaczej, nie ma znaczenia, ile testów zostanie przeprowadzonych, zawsze jest to tylko dobre przypuszczenie .
Oto pierwsze 8 bajtów w pliku niektórych popularnych typów plików, które mogą pomóc nam poczuć, jak te magiczne liczby mogą wyglądać:
Jeśli nie można znaleźć typu pliku podczas testów magicznych, plik wydaje się być plikiem tekstowym i
file
szuka kodowania zawartości. Kodowanie wyróżnia się różnymi zakresami i sekwencjami bajtów, które stanowią tekst do wydrukowania w każdym zestawie.Podziały linii są również badane, w zależności od ich wartości HEX:
0A
(\n
) klasyfikuje plik zakończony Un * x / Linux / BSD / OSX0D 0A
(\r\n
) są plikami z systemów operacyjnych Microsoft0D
(\r
) byłby systemem Mac OS do wersji 915
(\025
) byłby IBM AIXTeraz zaczynają się testy językowe . Jeśli wydaje się, że jest to plik tekstowy, plik jest przeszukiwany pod kątem określonych ciągów, aby dowiedzieć się, który język zawiera (C, Perl, Bash). Niektóre języki skryptowe można również zidentyfikować za pomocą hashbang (
#!/bin/interpreter
) w pierwszym wierszu skryptu.Jeśli nic nie dotyczy pliku, nie można określić typu pliku i
file
po prostu drukuje „dane”.Widzisz więc, że nie ma potrzeby stosowania przyrostka. Przyrostek i tak może się pomylić, jeśli zostanie ustawiony nieprawidłowo.
źródło
file(1)
, co robi, ale z (bardzo) inną implementacją.Często to nie obchodzi. Po prostu przekazujesz go do programu, który interpretuje go lub nie. Otwarcie pliku .jpg w edytorze tekstu może być nieprzydatne, ale nie jest to niemożliwe. Rozszerzenie, podobnie jak reszta nazwy pliku, służy organizacyjnej wygodzie ludzi.
Może być również możliwe tworzenie plików, które można poprawnie interpretować na wiele sposobów. Ponieważ format pliku ZIP zaczyna się od nagłówka na końcu pliku , możesz wstawić inne rzeczy na wierzch i nadal będzie on ładowany jako plik ZIP. Jest to powszechnie używane do tworzenia samorozpakowujących się plików zip.
źródło
Informacje te często znajdują się w nagłówku pliku.
file
Komenda analizuje cel i powie Ci informacje na temat pliku. Wiele informacji jest często uzyskiwanych z nagłówków plików, które często są pierwszymi kilkoma bajtami pliku (patrz poniżej). Nagłówki są używane przez system, aby dowiedzieć się, jak obsługiwać pliki.#!/bin/bash
na początku pliku informuje system, aby używał powłoki bash do interpretowania następującego skryptu.ELF
informuje system, że jest to plik wykonywalny ELF.Przykłady nagłówków plików:
źródło
file
Polecenie próbuje odgadnąć od zawartości pliku jak plik jest prawdopodobnie przeznaczonych do użytku. To nie jest nieomylne.file
. W rzeczywistości dokonuje analizy pliku. Jednak większość typów plików jest identyfikowana przez rodzaj nagłówka.0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
jest nagłówkiem pliku wykonywalnego ELF (kilka pierwszych bajtów / bin / ls). Podobnie#!/bin/bash
na początku pliku ASCII zidentyfikowałby go jako skrypt powłoki. Kolejny przykład:0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
(obraz w formacie .png)Pierwszą rzeczą, którą należy sprawdzić, jest zakodowany na stałe typ pliku rozpoznawany przez jądro. Są to typy plików, takie jak katalog, plik specjalny znak, plik specjalny blok, plik specjalny potok, gniazdo i łącze symboliczne. Ta informacja pochodzi z i-węzła pliku. Jeśli plik jest zwykłym plikiem, następny zestaw informacji pochodzi z pierwszych 256 bajtów w poszukiwaniu wzorców. W ten sposób pliki tekstowe i kod źródłowy C są rozpoznawane przez sprawdzenie tych bajtów. Ponadto narzędzia szukają również magicznej liczby, która służy do testowania i sprawdzania poprawności typu pliku. Możesz dodać własne typy plików, które będą rozpoznawane, dodając informacje do pliku
/etc/magic
. Sprawdź stronę podręcznika,magic(5)
aby zobaczyć format pliku magicznego.W starszej implementacji (na przykład Solaris) plik
/etc/magic
wyliczył większość rozpoznanych typów plików.źródło
file
Komenda odnosi pewne heurystyki z inspekcji (części) plik i podejmowania wykwalifikowanego przypuszczenie. Poza tym istnieją specjalne przypadki, w których można uzyskać dodatkowe informacje; jak#!
na początku pliku tekstowego, BoM (znak kolejności bajtów) lub określone bajty nagłówka wykonywalnych formatów plików. Te#!
i binarne znaki w wykonywalnych są wykorzystywane przez system do ich odróżnić.źródło
System nie wie, czy plik jest binarny czy tekstowy. We wszystkich (AFAIK) systemach operacyjnych typu Unix
fopen(path, "rb")
jest dokładnie taki sam jakfopen(path "r")
-b
nie ma żadnego efektu. Jest to akceptowane, ponieważ standard C musi być przenośny dla niektórych innych systemów operacyjnych, które dokonują takiego rozróżnienia.źródło
W dawnych czasach osób obsługujących komputery mainframe ich systemy operacyjne obsługiwały kilka typów plików, w tym sekwencyjne i indeksowo-sekwencyjne. Nowoczesne systemy operacyjne (Un * x i prawdopodobnie Windows) ograniczają zestaw typów plików do minimum (w tym wykonywalny, współużytkowany obiekt).
Możliwe, że istnieje trudny format pliku: fragment kodu C, który można interpretować jako opis obrazu. Poza tym istnieją różne, coraz mniej szczegółowe formaty: plik tekstowy, plik XML, dokument SOAP.
źródło