Ich muss die Art der Daten in zufälligen Dateien erkennen. Ich bin neu in Linux.
Ich plane, den file
Befehl zu verwenden, um zu verstehen, welche Art von Daten eine Datei hat. Ich habe diesen Befehl ausprobiert und die folgende Ausgabe erhalten.
Jemand schlug mir vor, dass der file
Befehl die Anfangsbytes einer Datei untersucht, um den Datentyp zu bestimmen. Der file
Befehl betrachtet überhaupt keine Dateierweiterung. Ist das korrekt? Ich schaute auf die Manpage , fand sie aber zu technisch. Ich würde mich freuen, wenn jemand einen Link zur Verfügung stellen kann, der viel einfacher zu erklären ist, wie der file
Befehl funktioniert.
Was sind verschiedene mögliche Antworten, die ich nach dem Ausführen des file
Befehls erhalten könnte? Zum Beispiel erhalte ich in der folgenden Abschrift JPEG, ISO-Medien, ASCII usw.:
Die Bildschirmausgabe ist wie folgt
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
Update 1
Vielen Dank für die Antworten und sie haben ein paar Dinge für mich geklärt.
Wenn ich das richtig verstehe, verfügt der Ordner / usr / share / mime / magic über eine Datenbank, die mir die aktuell möglichen Dateiformate angibt (Ausgaben, die ich erhalten kann, wenn ich den Befehl file eingebe und einer Datei folge). Ist das korrekt? Stimmt es, dass, wenn die Befehlsausgabe "Datei" das Wort "Text" enthält, sie sich auf etwas bezieht, das Sie mit einem Textbetrachter lesen können, und alles ohne "Text" eine Art Binärdatei ist?
quelle
Antworten:
file
verwendet verschiedene Arten von Tests :Dies wird ausgegeben wie
cannot open file: No such file or directory
.Dies wird ausgegeben wie
.: directory
und/dev/sda: block special
. Ein Großteil des Formats für diesen und den vorherigen Punkt wird teilweise von POSIX definiert - Sie können sich darauf verlassen, dass bestimmte Zeichenfolgen in der Ausgabe enthalten sind.Das ist
foo: empty
.Diese beiden verwenden die magische Nummernidentifikation und sind der interessanteste Teil des Befehls. Eine magische Zahl ist eine spezielle Folge von Bytes, die sich an einer bekannten Stelle in einer Datei befindet und deren Typ identifiziert. Traditionell sind dies die ersten zwei Bytes, aber der Begriff wurde noch erweitert, um längere Zeichenfolgen und andere Positionen einzuschließen. Weitere Informationen zu magischen Zahlen im Befehl finden Sie in dieser anderen Frage
file
.Der
file
Befehl verfügt über eine Datenbank mit diesen Nummern und dem Typ, dem sie entsprechen. Diese Datenbank befindet sich normalerweise in/usr/share/mime/magic
und ordnet den Dateiinhalten MIME-Typen zu . Die Ausgabe dort (oft ein Teil davon,file -i
wenn Sie sie nicht standardmäßig erhalten) ist ein definierter Medientyp oder eine Erweiterung. "Kontextsensitive Tests" verwenden den gleichen Ansatz, sind jedoch etwas unübersichtlicher. Keines davon ist garantiert richtig, aber es ist beabsichtigt, gute Vermutungen anzustellen.file
verfügt außerdem über eine Datenbank, die diese Typen Namen zuordnet, anhand derer bekannt ist, dass eine identifizierte Datei als bezeichnet werdenapplication/pdf
kannPDF document
. Diese für Menschen lesbaren Namen können auch in eine andere Sprache übersetzt werden. Hierbei handelt es sich immer um eine allgemeine Beschreibung des Dateityps in einer Weise, die eine Person verstehen wird, und nicht um eine Maschine.Die meisten unterschiedlichen Ausgaben, die Sie erhalten können, stammen aus diesen Phasen. In der
magic
Datei finden Sie eine Liste der unterstützten Typen und deren Identifizierung. Mein System kennt 376 verschiedene Typen. Die angegebenen Namen und die unterstützten Typen werden von der Systemverpackung und -konfiguration bestimmt. Daher unterstützt Ihr System möglicherweise mehr oder weniger als meins, aber im Allgemeinen gibt es viele davon.libmagic
enthält auch zusätzliche hartcodierte Tests.Dies ist
foo: data
, wenn es überhaupt nichts über die Datei herauszufinden.Es gibt auch andere kleine Tags, die angezeigt werden können. Eine ausführbare (
+x
) - Datei wirdexecutable
in der Ausgabe " " normalerweise durch Kommas getrennt. Diefile
Implementierung kann auch zusätzliche Informationen zu einigen Dateiformaten enthalten, um zusätzliche Informationen zu diesen Formaten wie in "PDF document, version 1.4
" beschreiben zu können.quelle
Manpages sind in der Regel knappe Verweise, keine Einführungen. Beginnen Sie mit der Wikipedia-Seite .
file
schaut nur auf den Dateiinhalt, nicht auf den Dateinamen. (Es werden auch einige Dateimetadaten wie der Dateityp betrachtet: Verzeichnis, symbolischer Link, Named Pipe usw. In den Fällen, die Sie interessieren, ist jedoch der Inhalt von Bedeutung.)file
In der Regel wird das Format einer Datei anhand der ersten Bytes erraten und mit einer integrierten Tabelle mit magischen Zahlen verglichen . Wenn die Datei beispielsweise mit beginnt%PDF
,file
wird "PDF-Dokument" gemeldet (und es wird weiter gegraben, um die Mindestversion zu melden). Für Dateitypen, die nicht mit magischen Zahlen beginnen, enthält sie Heuristiken, z. B. „ASCII-Text“, wenn die ersten Bytes alle im druckbaren ASCII-Bereich liegen.Die Ausgabe von
file
ist fragil: Sie kann von Unix-Variante zu Unix-Variante und von Version zu Version variieren. Unter Linux, Cygwin und * BSD unterstützt derfile
Befehl eine Option,-i
die eine vorhersagbare Ausgabe in Form eines MIME- Medientyps erzeugt (IANA verwaltet die Liste der Standardmedientypen ). Es gibt nicht so viele Details und die Ausgabe ist weniger benutzerfreundlich, aber die Ausgabe ist vorhersehbar und computerfreundlich.Verwenden
file --mime-type
Sie diese Option, wenn Sie nur den MIME-Typ selbst ohne Codierungsinformationen möchten, zapplication/pdf
. Übergeben Sie die Option,-b
wenn Sie den Dateinamen nicht am Zeilenanfang anzeigen möchten.quelle
Ich möchte, dass Sie die Antwort von hier lesen . Einige der Auszüge aus der Antwort sind:
Aus der Manpage des
file
Kommandos,file
Befehl führt tatsächlich 3 Tests zum Bestimmen des Dateityps durch.Erster Test
Zweiter Test
Dritter Test
Die Ausgabe des
file
Befehls basiert im Allgemeinen auf dem Ergebnis eines erfolgreichen Tests.Angenommen, das C ++ - Programm startet wie folgt und der dritte Test ist erfolgreich.
Gemäß dem dritten Test gibt das Schlüsselwort
#include
insbesondere an, dass es sich um ein Programm vom Typ C handelt , obwohl wir ein CPP- Programm zur Hand haben. Wenn ich jetzt nachschaue,Die Konzepte der Objektorientierung sind jetzt spezifisch für C ++. Lassen Sie uns eine für C ++ spezifische Datei erstellen .
Ich starte mein C ++ Programm als,
Nun, wenn ich ausstelle
Die Ausgabe ist,
Dies erklärt im Wesentlichen, wie der
file
Befehl für ähnliche Dateien funktioniert (in diesem Beispiel werden C-Programm und C ++ - Programm gleich behandelt, sofern und bis wir die objektorientierten Funktionen verwenden, die für C ++ spezifisch sind).quelle
Gilles und Michael Homer haben hervorragende Antworten geliefert. auf die ich dich beziehe. Führen Sie das Programm aus, um die auf Ihrem System erkannten Dateitypen anzuzeigen
Wenn das Berechtigungsprobleme gibt oder nicht existiert, dann möglicherweise
(Je nach System müssen möglicherweise Anpassungen vorgenommen werden.) Daraufhin sollte eine Liste der Dateitypen auf Ihrem System angezeigt werden. Die Ausführung dieses Befehls kann abhängig von der Größe Ihres Root-Dateisystems sehr lange dauern.
quelle