Linux-Dateibefehl zum Klassifizieren von Dateien

17

Ich muss die Art der Daten in zufälligen Dateien erkennen. Ich bin neu in Linux.

Ich plane, den fileBefehl 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 fileBefehl die Anfangsbytes einer Datei untersucht, um den Datentyp zu bestimmen. Der fileBefehl 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 fileBefehl funktioniert.

Was sind verschiedene mögliche Antworten, die ich nach dem Ausführen des fileBefehls 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?

user2543622
quelle
6
In Zukunft wird es nicht mehr empfohlen, ein Bild der Terminalausgabe zu veröffentlichen (oder von irgendjemandem genutzt). Verwenden Sie die Formatierung des Markdown-Codeblocks.
HalosGhost
3
Ich habe das Bild entfernt und den Code gepostet.
user2543622
Nur als Hinweis: Wenn die Datei eine Datei nicht identifizieren kann, kann dies häufig die TrID . Es verfügt über eine eigene Datenbank mit Dateieigenschaften, die von der Community erstellt wurde.
Josef

Antworten:

13

file verwendet verschiedene Arten von Tests :

1: Wenn die Datei nicht vorhanden ist, nicht gelesen werden kann oder der Dateistatus nicht ermittelt werden konnte, zeigt die Ausgabe an, dass die Datei verarbeitet wurde, ihr Typ jedoch nicht ermittelt werden konnte.

Dies wird ausgegeben wie cannot open file: No such file or directory.

2: Wenn es sich bei der Datei nicht um eine reguläre Datei handelt, muss der Dateityp angegeben werden. Die Dateitypen Verzeichnis, FIFO, Socket, Block Special und Character Special sind als solche zu kennzeichnen. Andere implementierungsdefinierte Dateitypen können ebenfalls identifiziert werden. Wenn die Datei eine symbolische Verknüpfung ist, wird die Verknüpfung standardmäßig aufgelöst und die Datei testet den Dateityp, auf den die symbolische Verknüpfung verweist. (Siehe die -hund -iOptionen unten.)

Dies wird ausgegeben wie .: directoryund /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.

3: Wenn die Länge der Datei Null ist, wird sie als leere Datei identifiziert.

Das ist foo: empty.

4: Das Dateidienstprogramm soll ein erstes Dateisegment untersuchen und anhand von positionssensitiven Tests eine Vermutung zur Identifizierung seines Inhalts anstellen. (Es wird nicht garantiert, dass die Antwort korrekt ist. Siehe die Optionen -d, -M und -m weiter unten.)

5: Das Dateidienstprogramm soll die Datei untersuchen und anhand von kontextsensitiven Standardsystemtests eine Vermutung anstellen, ob der Inhalt vorhanden ist. (Die Antwort ist nicht garantiert korrekt.)

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 Fragefile .

Der fileBefehl verfügt über eine Datenbank mit diesen Nummern und dem Typ, dem sie entsprechen. Diese Datenbank befindet sich normalerweise in /usr/share/mime/magicund ordnet den Dateiinhalten MIME-Typen zu . Die Ausgabe dort (oft ein Teil davon, file -iwenn 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.

fileverfügt außerdem über eine Datenbank, die diese Typen Namen zuordnet, anhand derer bekannt ist, dass eine identifizierte Datei als bezeichnet werden application/pdfkann PDF 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 magicDatei 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. libmagicenthält auch zusätzliche hartcodierte Tests.

6: Die Datei ist als Datendatei zu kennzeichnen.

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 wird executablein der Ausgabe " " normalerweise durch Kommas getrennt. Die fileImplementierung 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.

Michael Homer
quelle
8

Manpages sind in der Regel knappe Verweise, keine Einführungen. Beginnen Sie mit der Wikipedia-Seite .

fileschaut 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.)

fileIn 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, filewird "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 fileist fragil: Sie kann von Unix-Variante zu Unix-Variante und von Version zu Version variieren. Unter Linux, Cygwin und * BSD unterstützt der fileBefehl eine Option, -idie 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.

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

Verwenden file --mime-typeSie diese Option, wenn Sie nur den MIME-Typ selbst ohne Codierungsinformationen möchten, z application/pdf. Übergeben Sie die Option, -bwenn Sie den Dateinamen nicht am Zeilenanfang anzeigen möchten.

Gilles 'SO - hör auf böse zu sein'
quelle
5

Ich möchte, dass Sie die Antwort von hier lesen . Einige der Auszüge aus der Antwort sind:

Aus der Manpage des fileKommandos,

file Befehl führt tatsächlich 3 Tests zum Bestimmen des Dateityps durch.

Erster Test

Die Dateisystemtests basieren auf der Überprüfung der Rückkehr von einem stat (2) -Systemaufruf.

Zweiter Test

Die magischen Zahlentests werden verwendet, um nach Dateien mit Daten in bestimmten festen Formaten zu suchen.

Dritter Test

Die Sprachtests suchen nach bestimmten Zeichenfolgen (vgl. Names.h), die an einer beliebigen Stelle in den ersten Blöcken einer Datei vorkommen können. Das Schlüsselwort .br gibt beispielsweise an, dass die Datei höchstwahrscheinlich eine troff (1) -Eingabedatei ist, genau wie das Schlüsselwort struct ein C-Programm angibt.

Die Ausgabe des fileBefehls basiert im Allgemeinen auf dem Ergebnis eines erfolgreichen Tests.

Angenommen, das C ++ - Programm startet wie folgt und der dritte Test ist erfolgreich.

#include <iostream.h>
bla
bla

Gemäß dem dritten Test gibt das Schlüsselwort #includeinsbesondere an, dass es sich um ein Programm vom Typ C handelt , obwohl wir ein CPP- Programm zur Hand haben. Wenn ich jetzt nachschaue,

$ file example.cpp

example.cpp: ASCII C program text

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,

Class something
{
}
bla
bla

Nun, wenn ich ausstelle

$ file example.cpp

Die Ausgabe ist,

example.cpp: ASCII C++ program text

Dies erklärt im Wesentlichen, wie der fileBefehl 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).

Ramesh
quelle
1

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

cat /usr/share/magic

Wenn das Berechtigungsprobleme gibt oder nicht existiert, dann möglicherweise

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(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.

Warwick
quelle