Linux określa typ pliku za pomocą kodu w nagłówku pliku. Nie zależy od rozszerzeń plików, aby wiedzieć, jakiego oprogramowania należy użyć do otwarcia pliku.
Tak pamiętam z mojej edukacji. Popraw mnie, jeśli się mylę!
Praca trochę z systemami Ubuntu ostatnio: Widzę wiele plików na systemach, które mają rozszerzenia takie jak .sh
, .txt
, .o
,.c
Teraz zastanawiam się: czy te rozszerzenia są przeznaczone tylko dla ludzi? Żeby dowiedzieć się, jaki to plik?
A może mają też jakiś cel dla systemu operacyjnego?
files
file-format
mime-type
mizech
źródło
źródło
gzip
,bzip2
,xz
- i tak dalej. Programy te używają przyrostków do oddzielenia skompresowanej wersji pliku od nieskompresowanego, który zastępują. Programy kompresyjne często narzekają na niepoprawny sufiks, nawet jeśli plik faktycznie jest plikiem skompresowanym typu, który powinien obsługiwać.Odpowiedzi:
Gdy wchodzisz w interakcję z innymi systemami operacyjnymi, które zależą od tego, jakie rozszerzenia są, to mądrzejszym pomysłem jest ich użycie.
W systemie Windows oprogramowanie otwierające jest dołączone do rozszerzeń.
Otwierając plik tekstowy o nazwie „plik” jest trudniejsze niż w Windows otwierania tego samego pliku o nazwie „plik.txt” (trzeba będzie przełączyć otwarty dialog z pliku
*.txt
, aby*.*
za każdym razem). To samo dotyczy plików tekstowych oddzielonych tabulatorami i średnikami. To samo dotyczy importowania i eksportowania wiadomości e-mail (rozszerzenie .mbox).W szczególności podczas kodowania oprogramowania. Otwarcie pliku o nazwie „software1”, czyli pliku HTML i „software2”, czyli pliku JavaScript, staje się trudniejsze w porównaniu z „software.html” i „software.js”.
Jeśli w systemie Linux istnieje system, w którym rozszerzenia plików są ważne, nazwałbym to błędem. Gdy oprogramowanie zależy od rozszerzeń plików, można to wykorzystać. Używamy dyrektywy interpretera do identyfikacji pliku („pierwsze dwa bajty w pliku mogą być znakami„ #! ”, Które stanowią liczbę magiczną (szesnastkowa 23 i 21, wartości ASCII„ # ”i„! „) często określane jako shebang”).
Najbardziej znanym problemem z rozszerzeniami plików był LOVE-LETTER-FOR-YOU.TXT.vbs w systemie Windows. Jest to wizualny skrypt podstawowy wyświetlany w eksploratorze plików jako plik tekstowy.
W Ubuntu po uruchomieniu pliku z Nautilus pojawia się ostrzeżenie, co zamierza zrobić. Wykonywanie skryptu z Nautilus, w którym chce uruchomić oprogramowanie, w którym powinien otworzyć gEdit, jest oczywistym problemem i otrzymujemy ostrzeżenie o tym.
W wierszu poleceń podczas wykonywania czegoś możesz wizualnie zobaczyć, jakie jest rozszerzenie. Gdyby skończył się na .vbs, stałbym się podejrzliwy (nie to, że .vbs jest wykonywalny w Linuksie. Przynajmniej nie bez większego wysiłku;)).
źródło
readme.txt
i sprawiasz, że jest on wykonywalny. Jeśli użytkownik go wykonał, nie otwiera edytora, ale uruchamia kod. Pod tym względem sprawianie, by rozszerzenia miały znaczenie (ale nie ukrywanie ich) jest bezpieczniejsze i łatwiejsze do wyjaśnienia dla niezorientowanych użytkowników. Istnieją inne różnice (przede wszystkim brak wykonywania plików z bieżącego katalogu), ale nie mają one nic wspólnego z rozszerzeniami.readme.txt
plik za pomocą edytora tekstu. Właśnie próbowałem z delfinem w KDE, tworząc skrypt powłoki dodający uprawnienia do plików wykonywalnych, zapisując go jako.txt
i kliknięcie spowoduje otwarcie go w Kate. Jeśli zmienię nazwę na,.sh
to kliknięcie spowoduje uruchomienie.file
są oparte na heurystyce, nie są określone.Nie ma tutaj odpowiedzi w 100% czarno-białej.
Zazwyczaj Linux nie polega na nazwach plików (i rozszerzeniach plików, tj. Części nazwy pliku po normalnie ostatnim okresie), a zamiast tego określa typ pliku, sprawdzając kilka pierwszych bajtów jego zawartości i porównując go z listą znanych magicznych liczb .
Na przykład wszystkie pliki obrazów bitmapowych (zwykle z rozszerzeniem nazwy
.bmp
) muszą zaczynać się literamiBM
w pierwszych dwóch bajtach. Skrypty w większości języków skryptowych, takich jak Bash, Python, Perl, AWK itp. (W zasadzie wszystko, co traktuje wiersze zaczynające się#
od komentarza) mogą zawierać shebang jak#!/bin/bash
pierwszy wiersz. Ten specjalny komentarz informuje system, w której aplikacji należy otworzyć plik.Tak więc zwykle system operacyjny opiera się na zawartości pliku, a nie jego nazwie, aby określić typ pliku, ale stwierdzenie, że rozszerzenia plików nigdy nie są potrzebne w systemie Linux, to tylko połowa prawdy.
Aplikacje mogą oczywiście zaimplementować sprawdzanie plików w dowolny sposób, co obejmuje weryfikację nazwy i rozszerzenia pliku. Przykładem jest Eye of Gnome (
eog
standardowa przeglądarka zdjęć), która określa format obrazu na podstawie rozszerzenia pliku i zgłasza błąd, jeśli nie pasuje do zawartości. To, czy jest to błąd, czy funkcja, można omówić ...Jednak nawet niektóre części systemu operacyjnego polegają na rozszerzeniach nazw plików, np. Podczas analizowania plików źródłowych oprogramowania w plikach
/etc/apt/sources.list.d/
-*.list
parsowane są tylko pliki z rozszerzeniem, wszystkie inne są ignorowane. Może nie jest używany głównie do określania typu pliku, ale raczej do włączania / wyłączania analizy niektórych plików, ale nadal jest to rozszerzenie pliku, które wpływa na sposób, w jaki system traktuje plik.I oczywiście ludzkie zyski użytkowników najbardziej z rozszerzeniami jak sprawia, że typ pliku oczywistej i pozwala również wiele plików o tej samej nazwie bazowej i różnych rozszerzeń, takich jak
site.html
,site.php
,site.js
,site.css
itd. Wadą jest to, oczywiście, że rozszerzenie pliku i rzeczywista typ pliku / treść niekoniecznie muszą być zgodne.Dodatkowo jest potrzebny do współdziałania między platformami, ponieważ np. Windows nie będzie wiedział, co zrobić z
readme
plikiem, ale tylkoreadme.txt
.źródło
#!
. Wszystko inne zależy od decyzji jakiejś aplikacji.eog
i nie wiem, dlaczego w ogóle dbają o nazwę pliku. To moim zdaniem błąd. Oczywiście, jeśli plik ma nazwę „bmp”, ale jego format zawartości nie pasuje, oczywiście wystąpi również błąd. Oczywiście każda aplikacja decyduje o sposobie weryfikacji plików, ale ogólnie aplikacje Linuksa nie powinny polegać na nazwie. Przy okazji możesz użyć programufile
commend do zbadania typów plików według ich zawartości.file
narzędzia tak naprawdę niczego nie dowodzi; to przydatne narzędzie, które może istnieć w dowolnym systemie operacyjnym. Jaka podstawowa część systemu operacyjnego sprawia, że uruchamianiefile
jest bardziej „poprawne” niż globowanie nazwy pliku?Jak wspomnieli inni, w Linuksie stosowana jest metoda dyrektywy interpretera (przechowywanie niektórych metadanych w pliku jako nagłówka lub liczby magicznej, aby można było powiedzieć właściwemu interpreterowi, aby ją przeczytał), a nie metoda powiązania rozszerzenia plików używana przez system Windows.
Oznacza to, że możesz utworzyć plik o dowolnej nazwie, którą lubisz ... z kilkoma wyjątkami
jednak
Chciałbym dodać słowo ostrzeżenia.
Jeśli masz w systemie jakieś pliki z systemu, który używa powiązania nazw plików, pliki mogą nie mieć tych magicznych liczb lub nagłówków. Rozszerzenia nazw plików służą do identyfikowania tych plików przez aplikacje, które potrafią je odczytać, a zmiana nazw takich plików może spowodować nieoczekiwane efekty. Na przykład:
Jeśli zmienisz nazwę pliku
My Novel.doc
naMy-Novel
, Libreoffice nadal będzie mógł go otworzyć, ale otworzy się on jako „Bez tytułu” i będziesz musiał go nazwać ponownie, aby go zapisać (Libreoffice domyślnie dodaje rozszerzenie, więc będziesz miał dwa plikiMy-Novel
iMy-Novel.odt
, co może być denerwujące)Mówiąc poważniej, jeśli zmienisz nazwę pliku My Spreadsheet.xlsx na My-Spreadsheet, a następnie spróbuj go otworzyć
xdg-open My-Spreadsheet
, otrzymasz to (ponieważ w rzeczywistości jest to skompresowany plik):A jeśli zmienisz nazwę pliku
My Spreadsheet.xls
naMy-Spreadsheet
, gdyxdg-open My-Spreadsheet
pojawi się komunikat o błędzie(Chociaż w obu tych przypadkach działa, jeśli tak zrobisz
soffice My-Spreadsheet
)Jeśli następnie zmień nazwę pliku bez rozszerzeń do
My-Spreadsheet.ods
zmv
i spróbuj otworzyć go dostaniesz to:(naprawa nie powiedzie się)
Będziesz musiał ponownie założyć oryginalne rozszerzenie, aby poprawnie otworzyć plik (możesz następnie przekonwertować format, jeśli chcesz)
TL; DR:
Jeśli masz pliki nienatywne z rozszerzeniami nazw, nie usuwaj rozszerzeń, zakładając, że wszystko będzie w porządku!
źródło
Chciałbym podejść do tego inaczej niż w przypadku innych odpowiedzi i zakwestionować pogląd, że „Linux” lub „Windows” mają z tym coś wspólnego (proszę o wyrozumiałość).
Pojęcie rozszerzenia pliku można po prostu wyrazić jako „konwencję identyfikującą typ pliku na podstawie części jego nazwy”. Inne typowe konwencje określania typu pliku to porównywanie jego zawartości z bazą danych znanych sygnatur (podejście „magicznej liczby”) i przechowywanie go jako dodatkowego atrybutu w systemie plików (podejście stosowane w oryginalnym systemie MacOS) .
Ponieważ każdy plik w systemie Windows lub Linux ma zarówno nazwę, jak i treść, procesy, które chcą poznać typ pliku, mogą użyć „rozszerzenia” lub „magicznej liczby”, jeśli uznają to za stosowne. Metoda metadanych nie jest ogólnie dostępna, ponieważ w większości systemów plików nie ma standardowego miejsca dla tego atrybutu.
W systemie Windows istnieje silna tradycja używania rozszerzenia pliku jako podstawowego sposobu identyfikowania pliku; najbardziej widoczna jest graficzna przeglądarka plików (Menedżer plików w systemie Windows 3.1 i Eksplorator w nowoczesnym systemie Windows), która korzysta z niego po dwukrotnym kliknięciu pliku w celu ustalenia, którą aplikację uruchomić. W systemie Linux (i bardziej ogólnie w systemach opartych na Uniksie) istnieje więcej tradycji sprawdzania zawartości; przede wszystkim jądro patrzy na początek pliku wykonywanego bezpośrednio, aby ustalić, jak go uruchomić; pliki skryptów mogą wskazywać interpretera do użycia, zaczynając
#!
od ścieżki, po której następuje ścieżka do interpretera.Te tradycje wpływają na projektowanie interfejsu użytkownika programów napisanych dla każdego systemu, ale istnieje wiele wyjątków, ponieważ każde podejście ma zalety i wady w różnych sytuacjach. Powody, dla których warto używać rozszerzeń plików zamiast sprawdzać zawartość, obejmują:
Przykłady programów systemu Linux, które domyślnie używają nazw plików (ale mogą mieć inne tryby):
źródło
#!
na początku. Dowolny plik z ustawionymi bitami (bitami) można wykonać na kilka sposobów.#!/bin/bash
i podobne podpisy określają tylko, którego tłumacza należy użyć. Jeśli taki podpis nie zostanie dostarczony, zakłada się domyślny interpreter powłoki. Plik zawierający tylko dwa słowa „Hello World”, ale z ustawionym bitem wykonania, spróbuje znaleźć polecenie „Hello” po uruchomieniu.Faktycznie, niektóre technologie nie polegać na rozszerzeń plików, więc jeśli korzystanie z tych technologii w Ubuntu, musisz polegać na zbyt rozszerzeń. Kilka przykładów:
gcc
używa rozszerzeń do rozróżnienia między plikami C i C ++. Bez rozszerzenia ich odróżnienie jest prawie niemożliwe (wyobraź sobie plik C ++ bez klas).docx
,jar
,apk
) są właśnie szczególnie strukturę archiwów ZIP. Chociaż zazwyczaj można wywnioskować typ z treści, nie zawsze jest to możliwe (np. Java Manifest jest opcjonalny wjar
plikach).Nieużywanie rozszerzeń plików w takich przypadkach będzie możliwe tylko przy hakujących obejściach i może być bardzo podatne na błędy.
źródło
gcc
jest front-endem dla plików C, dla plików C ++ potrzebujeszg++
frontonu lub przełącznika wiersza poleceń, aby określić język. Ważniejszy jestmake
program, który decyduje, czy użyćgcc
lubg++
zbudować konkretny plik - imake
jest całkowicie zależny od wzorców nazw plików (głównie rozszerzeń) w zakresie dopasowania reguł..cc
rozszerzeniemgcc
tak naprawdę zostanie skompilowany jako C ++, a dokumentuje toman gcc
: „Dla każdego pliku wejściowego przyrostek nazwy pliku określa rodzaj kompilacji:”, po której następuje lista rozszerzenia i sposób ich traktowania.make
jest również dobrym przykładem, alegcc
równie mocno opiera się na nazwach plików. Oto przykład jaśniejszy niż.c
vs.cc
: W przypadku Cgcc
używa przyrostków, aby stwierdzić, czy jego pierwszym krokiem jest wstępne przetworzenie (.c
), kompilacja (.i
), asemblacja (.s
) lub link (.o
). Tutaj używam-E
,-S
i-c
powiedzieć,gcc
gdzie się zatrzymać , ale używa nazw plików, aby wiedzieć, gdzie zacząć .gcc something.cc
nie będzie łączył się z odpowiednimi bibliotekami dla C ++, ale będzie traktował plik jako C ++, dlatego wielu użytkowników jest zdezorientowanych komunikatami o błędach, które otrzymują podczas popełnienia tego błędu.Twoje pierwsze założenie jest poprawne: rozszerzenia w Linuksie nie mają znaczenia i są przydatne tylko dla ludzi (i innych nie-uniksowych systemów operacyjnych, które dbają o rozszerzenia). Typ pliku jest określany przez pierwsze 32 bity danych w pliku, co jest znane jako liczba magiczna. Dlatego skrypty powłoki potrzebują
#!
linii - aby powiedzieć systemowi operacyjnemu, który interpreter ma wywołać. Bez tego skrypt powłoki jest tylko plikiem tekstowym.Jeśli chodzi o menedżerów plików, chcą znać rozszerzenia niektórych plików, takich jak
.desktop
pliki, które zasadniczo są takie same jak wersja skrótów Windows, ale mają więcej możliwości. Ale jeśli chodzi o system operacyjny, musi wiedzieć, co jest w pliku, a nie co w jego nazwieźródło
gunzip
który nie rozpakuje pliku, jeśli nie zostanie wywołanyfoo.gz
.gunzip
jest jednym przykładem,eog
jest innym. Ponadto wiele narzędzi nie będzie automatycznie uzupełniać nazw bez odpowiedniego rozszerzenia. Mówię tylko, że jest to trochę bardziej skomplikowane niż „rozszerzenia są zawsze nieistotne”.To jest zbyt duże, by odpowiedzieć na komentarz.
Pamiętaj, że nawet „rozszerzenie” ma wiele różnych znaczeń.
To, o czym mówisz, wydaje się być 3 literami po. DOS sprawił, że format 8.3 stał się bardzo popularny, a Windows używa części .3 do dziś.
Linux ma wiele plików, takich jak .conf lub .list lub .d lub .c, które mają znaczenie, ale tak naprawdę nie są rozszerzeniami w sensie 8.3. Na przykład Apache patrzy na /etc/apache2/sites-enabled/website.conf w poszukiwaniu swojej dyrektywy konfiguracyjnej. Podczas gdy system używa typów MIME i nagłówków treści oraz tego, czego nie należy określać, jest to plik tekstowy, Apache (domyślnie) nadal nie będzie go ładować bez końcówki .conf.
.c jest kolejnym świetnym. Tak, jest to plik tekstowy, ale gcc zależy od tego, czy main.c stanie się main.o, a na końcu main (po połączeniu). W żadnym momencie system nie używa rozszerzeń .c, .o ani żadnego rozszerzenia, aby mieć jakiekolwiek znaczenie w zakresie treści, ale rzeczy po. ma jakieś znaczenie. Prawdopodobnie skonfigurowałbyś swój SCM tak, aby ignorował main.o i main.
Chodzi o to, że rozszerzenia nie są używane tak, jak są w systemie Windows. Jądro nie uruchomi pliku .txt, ponieważ usuniesz część nazwy .txt. Bardzo przyjemnie jest również wykonać plik .txt, jeśli ustawione jest uprawnienie do wykonywania. Biorąc to pod uwagę, mają one znaczenie i nadal są używane na „poziomie komputera” do wielu rzeczy.
źródło
x.3
nazewnictwa więcej, masz już rozszerzenia również tam jak.doxc
,.torrent
,.part
, itd. To jest po prostu, że wiele formatów plików i rozszerzenia zostały już określone z powrotem w czasie, gdy 8,3 nazewnictwo było jeszcze coś, a później formaty najczęściej po prostu dostosowały konwencję użycia do 3 liter.gzip
plik Makefile itp.) Mogą zostać napisane w celu użycia tej konwencji w celu przyjęcia założeń dotyczących prawidłowego działania dla każdego pliku.dir
w wierszu polecenia nie powie mi nic takiego; to po prostu nie obchodzi. Wykonywanie plików jest z pewnością wyjątkiem w obu systemach operacyjnych; gdyby pytanie było ograniczone do nich, odpowiedź brzmiałaby, że DOS / Windows dba tylko o nazwę, a Unix / Linux dba tylko o uprawnienia do wykonywania i pierwsze bajty pliku. Poza tym zawsze jest jakaś aplikacja wybierająca konwencję do naśladowania.