Linux bestimmt den Typ einer Datei über einen Code im Datei-Header. Es hängt nicht von den Dateierweiterungen ab, welche Software zum Öffnen der Datei verwendet wird.
Daran erinnere ich mich aus meiner Ausbildung. Bitte korrigieren Sie mich, falls ich falsch liege!
Arbeiten ein wenig mit Ubuntu - Systemen vor kurzem: Ich sehe eine Menge von Dateien auf den Systemen , die Erweiterungen wie haben .sh
, .txt
, .o
,.c
Jetzt frage ich mich: Sind diese Erweiterungen nur für Menschen gedacht? Damit man eine Vorstellung davon bekommt, um welche Art von Datei es sich handelt?
Oder haben sie auch einen Zweck für das Betriebssystem?
files
file-format
mime-type
mizech
quelle
quelle
gzip
,bzip2
,xz
- und so weiter. Diese Programme verwenden Suffixe, um die komprimierte Version einer Datei von der nicht komprimierten zu trennen, die sie ersetzen. Komprimierungsprogramme beschweren sich häufig über ein falsches Suffix, obwohl es sich bei der Datei tatsächlich um eine komprimierte Datei des Typs handelt, den sie verarbeiten sollte.Antworten:
Wenn Sie mit anderen Betriebssystemen interagieren, bei denen es darauf ankommt, dass Erweiterungen das sind, was sie sind, ist es die klügere Idee, diese zu verwenden.
In Windows wird die Öffnungssoftware an die Erweiterungen angehängt.
Das Öffnen einer Textdatei mit dem Namen "file" ist in Windows schwieriger als das Öffnen derselben Datei mit dem Namen "file.txt" (Sie müssen das Dialogfeld
*.txt
zum Öffnen von zu*.*
jedem Mal wechseln ). Gleiches gilt für durch TAB und Semikolon getrennte Textdateien. Gleiches gilt für den Import und Export von E-Mails (Erweiterung .mbox).Insbesondere, wenn Sie Software codieren. Das Öffnen einer Datei mit dem Namen "software1", die eine HTML-Datei ist, und "software2", die eine JavaScript-Datei ist, wird im Vergleich zu "software.html" und "software.js" schwieriger.
Wenn es in Linux ein System gibt, auf dem Dateierweiterungen wichtig sind, würde ich das einen Fehler nennen. Wenn Software von Dateierweiterungen abhängt, ist dies ausnutzbar. Wir verwenden eine Interpreter-Direktive , um zu identifizieren, was eine Datei ist ("die ersten zwei Bytes in einer Datei können die Zeichen" #! "Sein, die eine magische Zahl bilden (hexadezimal 23 und 21, die ASCII-Werte von" # "und"! "). ") oft als shebang bezeichnet,").
Das bekannteste Problem mit Dateierweiterungen war LOVE-LETTER-FOR-YOU.TXT.vbs unter Windows. Dies ist ein Visual Basic-Skript, das im Datei-Explorer als Textdatei angezeigt wird.
Wenn Sie in Ubuntu eine Datei von Nautilus aus starten, erhalten Sie eine Warnung, was zu tun ist. Das Ausführen eines Skripts von Nautilus aus, in dem eine Software gestartet werden soll, mit der gEdit geöffnet werden soll, ist ein offensichtliches Problem, und es wird eine Warnung angezeigt.
Wenn Sie etwas ausführen, können Sie in der Befehlszeile visuell sehen, um welche Erweiterung es sich handelt. Wenn es auf .vbs endet, werde ich misstrauisch (nicht, dass .vbs unter Linux ausführbar ist. Zumindest nicht ohne weiteren Aufwand;)).
quelle
readme.txt
und machen sie ausführbar. Wenn der Benutzer es ausführt, wird der Editor nicht geöffnet, sondern der Code ausgeführt. In dieser Hinsicht ist es sicherer und einfacher, Erweiterungen für nicht versierte Benutzer zu erklären, wenn sie wichtig sind (aber nicht ausgeblendet werden). Es gibt andere Unterschiede (insbesondere, dass keine Dateien aus dem aktuellen Verzeichnis ausgeführt werden), aber sie haben nichts mit Erweiterungen zu tun.readme.txt
Datei mit einem Texteditor zu öffnen . Ich habe es gerade mit Delphin in KDE versucht, indem ich ein Shell-Skript erstellt habe, das ausführbare Berechtigungen hinzufügt..txt
Wenn ich es speichere und darauf klicke, wird es in Kate geöffnet. Wenn ich es umbenenne und.sh
dann darauf klicke, wird es ausgeführt.file
basieren auf Heuristiken und sind nicht eindeutig.Hier gibt es keine 100% schwarze oder weiße Antwort.
Normalerweise verlässt sich Linux nicht auf Dateinamen (und Dateierweiterungen, dh den Teil des Dateinamens nach dem normalerweise letzten Zeitraum) und ermittelt stattdessen den Dateityp, indem die ersten Bytes seines Inhalts untersucht und mit einer Liste bekannter magischer Zahlen verglichen werden .
Beispielsweise müssen alle Bitmap-Bilddateien (normalerweise mit Namenserweiterung
.bmp
) mit den BuchstabenBM
in den ersten beiden Bytes beginnen. Skripte in den meisten Skriptsprachen wie Bash, Python, Perl, AWK usw. (im Grunde genommen alles, was Zeilen behandelt, die mit einem#
Kommentar beginnen) können einen Schebang wie#!/bin/bash
eine erste Zeile enthalten. Dieser spezielle Kommentar teilt dem System mit, mit welcher Anwendung die Datei geöffnet werden soll.Normalerweise stützt sich das Betriebssystem auf den Dateiinhalt und nicht auf seinen Namen, um den Dateityp zu bestimmen. Die Aussage, dass unter Linux keine Dateierweiterungen erforderlich sind, ist jedoch nur die halbe Wahrheit.
Anwendungen können natürlich ihre Dateiprüfungen nach Belieben implementieren, einschließlich der Überprüfung des Dateinamens und der Dateierweiterung. Ein Beispiel ist das Eye of Gnome (
eog
Standard-Bildbetrachter), das das Bildformat anhand der Dateierweiterung bestimmt und einen Fehler ausgibt, wenn es nicht mit dem Inhalt übereinstimmt. Ob dies ein Fehler oder eine Funktion ist, kann diskutiert werden ...Allerdings sind auch einige Teile des Betriebssystems auf Dateinamenerweiterungen angewiesen, z. B. wenn Sie die Quelldateien Ihrer Software analysieren.
/etc/apt/sources.list.d/
Nur Dateien mit der*.list
Erweiterung werden analysiert, alle anderen werden ignoriert. Es wird möglicherweise nicht hauptsächlich verwendet, um den Dateityp zu bestimmen, sondern um das Parsen einiger Dateien zu aktivieren / deaktivieren. Es handelt sich jedoch weiterhin um eine Dateierweiterung, die sich auf die Behandlung einer Datei durch das System auswirkt.Und natürlich die menschlichen Benutzer Gewinne am meisten von Dateierweiterungen wie der Typen einer Datei offensichtlich macht und erlaubt auch mehrere Dateien mit dem gleichen Basisnamen und verschiedene Erweiterungen wie
site.html
,site.php
,site.js
,site.css
usw. Der Nachteil ist natürlich , dass die Dateierweiterung und die tatsächlichen Dateityp / Inhalt müssen nicht unbedingt übereinstimmen.Außerdem wird es für die plattformübergreifende Interoperabilität benötigt, da z. B. Windows nicht weiß, was mit einer
readme
Datei zu tun ist , sondern nur areadme.txt
.quelle
#!
. Alles andere hängt von der Entscheidung einer Anwendung ab.eog
und ich weiß nicht, warum ihnen der Dateiname überhaupt wichtig ist . Dies ist meiner Meinung nach ein Fehler. Und wenn die Datei den Namen "bmp" hat, aber das Inhaltsformat nicht übereinstimmt, tritt natürlich auch ein Fehler auf. Natürlich entscheidet jede Anwendung, wie Dateien überprüft werden sollen, aber im Allgemeinen sollten Linux-Anwendungen nicht auf den Namen angewiesen sein. Übrigens können Sie denfile
Befehl verwenden, um Dateitypen anhand ihres Inhalts zu untersuchen.file
Dienstprogramms beweist eigentlich nichts; Es ist ein nützliches Tool, das auf jedem Betriebssystem existieren kann. Welcher grundlegende Teil des Betriebssystems macht das Ausführenfile
"korrekter" als das Verschieben des Dateinamens?Wie bereits von anderen erwähnt, wird unter Linux eine Interpreter-Direktiven-Methode verwendet (die einige Metadaten in einer Datei als Header oder magische Zahl speichert, damit der richtige Interpreter zum Lesen aufgefordert wird) und nicht die von Windows verwendete Dateierweiterungs-Zuordnungsmethode.
Das bedeutet, dass Sie mit wenigen Ausnahmen eine Datei mit fast jedem beliebigen Namen erstellen können
jedoch
Ich möchte ein Wort der Vorsicht hinzufügen.
Wenn auf Ihrem System Dateien vorhanden sind, die mit Dateinamen verknüpft sind, enthalten die Dateien möglicherweise keine magischen Zahlen oder Überschriften. Dateinamenerweiterungen werden verwendet, um diese Dateien durch Anwendungen zu identifizieren, die sie lesen können. Wenn Sie solche Dateien umbenennen, kann dies zu unerwarteten Effekten führen. Zum Beispiel:
Wenn Sie eine Datei
My Novel.doc
in umbenennenMy-Novel
, kann Libreoffice sie weiterhin öffnen, sie wird jedoch als "Unbenannt" geöffnet, und Sie müssen sie erneut benennen, um sie zu speichern (Libreoffice fügt standardmäßig eine Erweiterung hinzu zwei DateienMy-Novel
undMy-Novel.odt
, was nervig sein könnte)Wenn Sie eine Datei "My Spreadsheet.xlsx" in "My-Spreadsheet" umbenennen und versuchen, sie mit "My-Spreadsheet" zu öffnen, erhalten
xdg-open My-Spreadsheet
Sie Folgendes (da es sich tatsächlich um eine komprimierte Datei handelt):Und wenn Sie eine Datei
My Spreadsheet.xls
in umbenennenMy-Spreadsheet
, erhaltenxdg-open My-Spreadsheet
Sie eine Fehlermeldung(Obwohl es in beiden Fällen in Ordnung ist, wenn Sie dies tun
soffice My-Spreadsheet
)Wenn Sie dann die Datei ohne Dateierweiterung in
My-Spreadsheet.ods
mit umbenennenmv
und versuchen, sie zu öffnen, erhalten Sie Folgendes:(Reparatur schlägt fehl)
Und Sie müssen die ursprüngliche Erweiterung wieder herstellen, um die Datei korrekt zu öffnen (Sie können das Format dann konvertieren, wenn Sie möchten)
TL; DR:
Wenn Sie nicht native Dateien mit Namenserweiterungen haben, entfernen Sie die Erweiterungen nicht, da sonst alles in Ordnung ist!
quelle
Ich würde dies gerne anders angehen als andere Antworten und den Gedanken in Frage stellen, dass "Linux" oder "Windows" irgendetwas damit zu tun haben (ertrage es mit mir).
Das Konzept einer Dateierweiterung kann einfach ausgedrückt werden als "Konvention zum Identifizieren des Dateityps anhand eines Teils seines Namens". Die anderen gängigen Konventionen zum Identifizieren des Dateityps sind der Vergleich des Inhalts mit einer Datenbank bekannter Signaturen (der "Magic Number" -Ansatz) und das Speichern des Dateityps als zusätzliches Attribut im Dateisystem (der im ursprünglichen MacOS verwendete Ansatz). .
Da jede Datei auf einem Windows- oder Linux-System sowohl einen Namen als auch einen Inhalt hat, können Prozesse, die den Dateityp kennen möchten, nach Belieben entweder die "Erweiterung" oder die "magische Zahl" verwenden. Der Metadatenansatz ist nicht allgemein verfügbar, da dieses Attribut auf den meisten Dateisystemen nicht standardmäßig platziert ist.
Unter Windows gibt es eine lange Tradition, die Dateierweiterung als primäres Mittel zur Identifizierung einer Datei zu verwenden. Am sichtbarsten ist, dass der grafische Dateibrowser (Dateimanager unter Windows 3.1 und Explorer unter modernen Windows) ihn verwendet, wenn Sie auf eine Datei doppelklicken, um zu bestimmen, welche Anwendung gestartet werden soll. Unter Linux (und allgemein auf Unix-basierten Systemen) gibt es mehr Tradition für die Überprüfung der Inhalte. Vor allem betrachtet der Kernel den Anfang einer Datei, die direkt ausgeführt wird, um zu bestimmen, wie sie ausgeführt werden soll. Skriptdateien können einen zu verwendenden Interpreter angeben, indem sie mit
#!
gefolgt vom Pfad zum Interpreter beginnen.Diese Traditionen beeinflussen das Design der Benutzeroberfläche von Programmen, die für jedes System geschrieben wurden. Es gibt jedoch zahlreiche Ausnahmen, da jeder Ansatz in verschiedenen Situationen Vor- und Nachteile hat. Gründe für die Verwendung von Dateierweiterungen anstelle der Prüfung von Inhalten sind:
Beispiele für Linux-Programme, die standardmäßig Dateinamen verwenden (aber möglicherweise andere Modi haben):
quelle
#!
am Anfang ausführbar gemacht werden . Jede Datei, deren ausführbare Bits gesetzt sind, kann auf verschiedene Arten ausgeführt werden.#!/bin/bash
und ähnliche Signaturen geben nur an, welcher Interpreter verwendet werden soll. Wird keine solche Signatur angegeben, wird der Standard-Shell-Interpreter verwendet. Eine Datei, die nur die zwei Wörter 'Hello World' enthält, aber deren Ausführungsbit gesetzt ist, versucht beim Ausführen, einen 'Hello'-Befehl zu finden.Eigentlich einige Technologien haben auf Dateiendungen verlassen, wenn Sie also diese Technologien in Ubuntu verwenden, werden Sie auf Erweiterungen verlassen müssen. Einige Beispiele:
gcc
Verwendet Erweiterungen, um zwischen C- und C ++ - Dateien zu unterscheiden. Ohne die Erweiterung ist es so gut wie unmöglich, sie zu unterscheiden (stellen Sie sich eine C ++ - Datei ohne Klassen vor).docx
,jar
,apk
) sind nur besonders ZIP - Archive strukturiert. Während Sie normalerweise den Typ aus dem Inhalt ableiten können, ist dies möglicherweise nicht immer möglich (z. B. ist Java Manifest in Dateien optionaljar
).In solchen Fällen ist es nur unter schwierigen Bedingungen möglich, keine Dateierweiterungen zu verwenden, und es ist wahrscheinlich, dass dies sehr fehleranfällig ist.
quelle
gcc
ist das Front-End für C-Dateien. Für C ++ - Dateien benötigen Sie entweder dasg++
Front-End oder einen Befehlszeilenschalter, um die Sprache anzugeben. Wichtiger ist dasmake
Programm, das entscheidet, ob eine bestimmte Datei verwendetgcc
oderg++
erstellt wird - und dessenmake
Regelübereinstimmung vollständig von Dateinamenmustern (meistens Erweiterungen) abhängt..cc
Erweiterung mitgcc
kompilieren, wird sie tatsächlich als C ++ kompiliert. Dies ist dokumentiert inman gcc
: "Für eine bestimmte Eingabedatei bestimmt das Dateinamensuffix, welche Art der Kompilierung durchgeführt wird:" gefolgt von einer Liste mit Erweiterungen und wie sie behandelt werden.make
ist auch ein gutes Beispiel, ist abergcc
genauso stark auf Dateinamen angewiesen. Hier ist ein Beispiel, das klarer ist als.c
vs.cc
: Bei Cgcc
werden Suffixe verwendet, um festzustellen, ob der erste Schritt darin besteht, vorab zu verarbeiten (.c
), zu kompilieren (.i
), zusammenzusetzen (.s
) oder zu verknüpfen (.o
). Hier verwende ich-E
,-S
und-c
zu sagen ,gcc
wo zu stoppen , aber es nutzt Dateinamen zu wissen , wo zu beginnen .gcc something.cc
nicht für C ++ auf die richtigen Bibliotheken verknüpfen , aber es wird die Datei als C ++, die viele Anwender ist zu behandeln , warum sie bekommen von den Fehlermeldungen sind verwirrt , wenn diese Fehler zu machen.Ihre erste Annahme ist richtig: Die Erweiterungen unter Linux spielen keine Rolle und sind nur für Menschen (und andere nicht-Unix-ähnliche Betriebssysteme, die sich um Erweiterungen kümmern) nützlich. Der Dateityp wird durch die ersten 32 Datenbits in der Datei bestimmt, die als magische Zahl bezeichnet werden. Aus diesem Grund benötigen Shell-Skripte eine
#!
Zeile, um dem Betriebssystem mitzuteilen, welcher Interpreter aufgerufen werden soll. Ohne es ist das Shell-Skript nur eine Textdatei.Was Dateimanager anbelangt, möchten sie die Erweiterungen einiger Dateien kennen, z. B.
.desktop
Dateien, die im Wesentlichen mit der Windows-Version von Verknüpfungen identisch sind, aber über mehr Funktionen verfügen. Was das Betriebssystem betrifft, muss es wissen, was in der Datei enthalten ist und nicht, was in ihrem Namen enthalten istquelle
gunzip
, dass eine Datei nicht dekomprimiert wird, wenn sie nicht aufgerufen wirdfoo.gz
.gunzip
ist ein Beispiel,eog
ist ein anderes. Außerdem werden viele Tools Namen ohne die richtige Erweiterung nicht automatisch vervollständigen. Ich sage nur, dass es etwas komplizierter ist als "Erweiterungen sind immer irrelevant".Dies ist eine zu große Antwort für einen Kommentar.
Denken Sie daran, dass auch "Erweiterung" eine Menge hat, wenn unterschiedliche Bedeutungen.
Worüber du redest, scheinen die 3 Buchstaben nach dem zu sein. DOS hat das 8.3-Format sehr populär gemacht und Windows verwendet bis heute den .3-Teil.
Linux hat viele Dateien wie .conf oder .list oder .d oder .c, die Bedeutung haben, aber keine wirklichen Erweiterungen im Sinne von 8.3 sind. Zum Beispiel sucht Apache in /etc/apache2/sites-enabled/website.conf nach seiner Konfigurationsanweisung. Während das System MIME-Typen und Inhaltsheader verwendet und nicht feststellt, dass es sich um eine Textdatei handelt, wird sie von Apache (standardmäßig) immer noch nicht geladen, ohne dass sie auf .conf endet.
.c ist eine andere großartige. Ja, es ist eine Textdatei, aber gcc hängt davon ab, dass main.c zu main.o und schließlich main (nach dem Verlinken) wird. Das System verwendet zu keinem Zeitpunkt die Erweiterung .c, .o oder no, um irgendeinen Sinn für den Inhalt zu haben, sondern nur das Zeug nach dem. hat eine Bedeutung. Sie würden Ihren SCM wahrscheinlich so einrichten, dass main.o und main ignoriert werden.
Der springende Punkt ist: Erweiterungen werden nicht wie in Windows verwendet. Der Kernel führt keine TXT-Datei aus, da Sie den TXT-Teil des Namens entfernen. Es ist auch sehr erfreut, eine TXT-Datei auszuführen, wenn die Ausführungsberechtigung festgelegt ist. Davon abgesehen haben sie eine Bedeutung und werden für viele Dinge immer noch auf "Computerebene" verwendet.
quelle
x.3
noch mehr Namensschema, hast du mehr Erweiterungen auch dort wie.doxc
,.torrent
,.part
usw. Es sind nur , dass viele Dateiformate und Erweiterungen wurden bereits zurück in der Zeit definiert , wenn 8.3 - Name noch eine Sache ist , und später Formate passten meist einfach die Konvention der Verwendung von bis zu 3 Buchstaben an.gzip
Ihr Makefile usw.) so geschrieben sind, dass diese Konvention verwendet wird, um Annahmen über die richtige Aktion für jede Datei zu treffen.dir
wenn ich an einer Eingabeaufforderung lasse, kann ich nichts davon erfahren. es ist einfach egal. Das Ausführen von Dateien ist auf beiden Betriebssystemen sicherlich eine Ausnahme. Wenn die Frage auf diese beschränkt wäre, würde die Antwort lauten, dass sich DOS / Windows nur um den Namen und Unix / Linux nur um die Ausführungsberechtigung und die ersten Bytes der Datei kümmern. Abgesehen davon gibt es immer eine Anwendung, die eine zu befolgende Konvention auswählt.