Dateityp unter Linux mit dem Befehl file bestimmen
Lerne, wie du mit file unter Linux den tatsächlichen Dateityp, MIME-Typ, symbolische Links und unbekannte Dateien zuverlässig untersuchst.
Der Linux-Befehl file untersucht den Inhalt und die Eigenschaften einer Datei und beschreibt, um welchen Dateityp es sich wahrscheinlich handelt. Das ist hilfreicher als die Dateiendung allein: Eine Datei namens bild.txt kann tatsächlich ein Bild sein, und eine Datei mit der Endung .pdf muss nicht zwingend ein PDF-Dokument enthalten.
Diese Lektion zeigt die Grundsyntax, die Erkennungsverfahren, wichtige Optionen, typische Ausgaben, Skriptverwendung und die Grenzen der Erkennung.
Was macht der Befehl file?
file ist ein Linux- und Unix-Befehl zur Untersuchung und Beschreibung eines Dateityps. Er berücksichtigt unter anderem Dateisystemeigenschaften, charakteristische Bytefolgen und Textmerkmale.
Eine Dateiendung ist lediglich ein Namenssuffix wie .txt, .jpg oder .pdf. Sie ist ein Hinweis für Menschen und Programme, beweist aber nicht, welchen Inhalt die Datei tatsächlich besitzt. file prüft dagegen die Datei selbst.
- Unbekannte Dateien ohne Endung untersuchen
- Downloads vor dem Öffnen prüfen
- Falsch benannte oder umbenannte Dateien erkennen
- Binärdateien, Bilder, Archive und Dokumente unterscheiden
- MIME-Typen für Skripte und automatisierte Verarbeitung abfragen
Grundsyntax
file DATEI
file DATEI1 DATEI2
Mit einem einzelnen Dateinamen prüfst du eine Datei:
file unbekannt
file /pfad/zur/unbekannt
Du kannst auch mehrere Dateien in einem Aufruf übergeben:
file datei.txt bild.jpg archiv.tar.gz
Relative Pfade beziehen sich auf das aktuelle Arbeitsverzeichnis. Absolute Pfade beginnen beispielsweise mit /home oder /tmp.
Dateinamen mit Leerzeichen müssen für die Shell geschützt werden:
file "mein Dokument.pdf"
file mein\ Dokument.pdf
Bei Dateinamen, die mit einem Bindestrich beginnen, trennt -- Optionen von Dateinamen:
file -- -bericht
file -- "-name mit Leerzeichen"
Wie file Dateitypen erkennt
file verwendet eine Reihe von Tests. Üblicherweise bestimmt das erste erfolgreiche Erkennungsergebnis die Ausgabe. Deshalb kann ein auffälliges Merkmal einen späteren, allgemeineren Test übertreffen.
| Testgruppe | Was geprüft wird | Beispiele für Ergebnisse |
|---|---|---|
| Dateisystemtests | Metadaten und besondere Objekte des Dateisystems | Verzeichnis, symbolischer Link, Gerät, FIFO oder Socket |
| Magic-Number-Tests | Charakteristische Bytefolgen an bestimmten Positionen | JPEG, PNG, PDF, ZIP, gzip oder ELF |
| Text- und Sprachtests | Lesbare Zeichen, Kodierung, Quelltextmerkmale und Shebangs | ASCII-Text, UTF-8-Text, Shell-Skript oder Python-Skript |
Dateisystemtests
Einige Dateitypen sind keine gewöhnlichen Datenströme. Verzeichnisse, symbolische Links, Geräte, FIFOs und Unix-Sockets sind spezielle Dateisystemobjekte. file kann solche Objekte über ihre Dateisysteminformationen erkennen.
Magic Numbers
Eine Magic Number ist eine charakteristische Kennung in den ersten Bytes oder an einer anderen definierten Position einer Datei. Beispielsweise besitzen viele Bild-, Archiv- und Dokumentformate feste Bytefolgen am Anfang. file vergleicht diese Daten mit Regeln aus einer Magic-Datei, also einer Sammlung von Signaturen und Prüfregeln.
Text- und Sprachtests
Wenn keine passendere Binärsignatur gefunden wird, untersucht file unter anderem, ob der Inhalt lesbarer Text ist. Dabei können Zeichenkodierungen wie US-ASCII oder UTF-8 sowie typische Merkmale von Quellcode und Skripten erkannt werden. Ein Shebang ist beispielsweise eine Interpreterangabe am Anfang eines Skripts, etwa #!/bin/sh oder #!/usr/bin/env python3.
Typische Ausgaben verstehen
Die genaue Formulierung hängt von der verwendeten Version und Magic-Datenbank ab. Der Dateiname steht normalerweise vor einem Doppelpunkt.
$ file notiz
notiz: ASCII text
$ file daten
Daten: Unicode text, UTF-8 text
$ file script.sh
script.sh: Bourne-Again shell script, ASCII text executable
$ file bild.jpg
bild.jpg: JPEG image data
$ file dokument.pdf
dokument.pdf: PDF document
$ file archiv.tar.gz
archiv.tar.gz: gzip compressed data
$ file programm
programm: ELF 64-bit LSB pie executable
$ file mein-link
mein-link: symbolic link to ziel
$ file projekt
projekt: directory
| Dateiart | Mögliche Erkennung | Hinweis |
|---|---|---|
| Textdatei | ASCII text | Einfacher Text mit ASCII-Zeichen |
| UTF-8-Textdatei | Unicode text, UTF-8 text | Zeichenkodierung wurde als UTF-8 erkannt |
| Shell-Skript | shell script, ASCII text executable | Ein Shebang oder typische Skriptmerkmale wurden gefunden |
| JPEG- oder PNG-Bild | JPEG image data oder PNG image data | Das Bildformat wird über seine Signatur erkannt |
| PDF-Dokument | PDF document | Die PDF-Signatur wurde erkannt |
| gzip- oder ZIP-Archiv | gzip compressed data oder Zip archive data | Oft wird zunächst nur die Kompressions- oder Containerhülle angezeigt |
| ELF-Programm | ELF 64-bit ... executable | ELF ist ein übliches Linux-Format für Programme, Objektdateien und Bibliotheken |
| Symbolischer Link | symbolic link to ... | Ohne -L wird der Link selbst beschrieben |
| Verzeichnis | directory | Das Dateisystemobjekt ist ein Verzeichnis |
Wichtige Optionen
| Option | Zweck | Typischer Einsatz |
|---|---|---|
-b beziehungsweise --brief | Dateinamen in der Ausgabe weglassen | Maschinell weiterverarbeitbare Typbeschreibung |
-i beziehungsweise --mime | MIME-Typ und Zeichenkodierung ausgeben | Beispielsweise text/plain; charset=utf-8 |
--mime-type | Nur den MIME-Typ ausgeben | Vergleich in Shell-Skripten |
-L beziehungsweise --dereference | Symbolischen Links folgen | Den Typ des Linkziels untersuchen |
-f DATEILISTE | Dateinamen aus einer Datei lesen | Viele Pfade zeilenweise prüfen |
-z beziehungsweise --uncompress | Bei unterstützten komprimierten Dateien zusätzlich den entpackten Inhalt untersuchen | Komprimierte Text- oder Programmdateien näher bestimmen |
-- | Das Ende der Optionen markieren | Dateinamen mit führendem Bindestrich sicher übergeben |
MIME-Typ und Kodierung
Ein MIME-Typ ist eine standardisierte Inhaltsbezeichnung wie text/plain, image/jpeg oder application/pdf.
file --mime dokument
file --mime-type dokument
--mime liefert typischerweise zusätzlich eine Zeichenkodierung, während --mime-type nur den MIME-Typ ausgibt. Die knappe Ausgabe ist besonders praktisch für Filter und Skripte.
Kurze Ausgabe ohne Dateinamen
file --brief DATEI
Bei mehreren Dateien enthält die normale Ausgabe den jeweiligen Dateinamen. Mit --brief wird nur die Beschreibung ausgegeben. In Skripten ist oft die Kombination aus --brief und --mime-type sinnvoll.
Symbolische Links
Ein symbolischer Link ist ein Dateisystemobjekt, das auf einen anderen Pfad verweist.
file mein-link
file -L mein-link
Ohne -L wird der Link als Link beschrieben. Mit -L folgt file dem Verweis und untersucht das Ziel. Bei einem defekten Link kann das Ziel nicht erfolgreich geprüft werden.
Dateien aus einer Liste
Mit -f liest file Dateinamen aus einer Textdatei. Üblicherweise wird jeder Zeile ein Dateiname entnommen:
file -f dateiliste.txt
Diese zeilenweise Form ist nicht für beliebige Dateinamen mit eingebetteten Zeilenumbrüchen geeignet. Für automatisierte Verarbeitung sollten Dateinamen deshalb möglichst nullterminiert weitergereicht werden, etwa mit find ... -print0 und xargs -0.
Komprimierte Inhalte und eigene Magic-Dateien
file -z DATEI
file -m /pfad/zu/eigene.magic DATEI
-z bittet file, bei unterstützten komprimierten Formaten auch in den Inhalt hineinzusehen. Das funktioniert nicht für jede Kompression und ersetzt kein vollständiges Entpacken.
Mit -m verwendest du eine angegebene Magic-Regeldatei. Das ist nützlich für spezielle oder proprietäre Formate. Die Regeln müssen zur verwendeten file-Version passen.
Praktische Beispiele
Eine unbekannte Datei prüfen
file unbekannt
file /pfad/zur/unbekannt
Die Ausgabe kann beispielsweise Text, ein Bildformat, ein Archiv oder eine ELF-Datei erkennen. Eine fehlende Endung verhindert die Untersuchung nicht.
Mehrere Dateien vergleichen
file datei.txt bild.jpg archiv.tar.gz
Jede Datei erhält eine eigene Typbeschreibung. So lässt sich schnell vergleichen, ob Endungen und tatsächliche Inhalte zusammenpassen.
Dateiendung mit dem Inhalt vergleichen
file bild.txt
file angeblich.pdf
Wenn bild.txt als Bild erkannt wird, ist die Endung vermutlich falsch oder irreführend. Wird angeblich.pdf nicht als PDF erkannt, sollte die Datei nicht allein wegen ihres Namens mit einem PDF-Programm geöffnet werden.
Dateityp in einem Shell-Skript auswerten
typ=$(file --brief --mime-type -- "$datei")
if [ "$typ" = "application/pdf" ]; then
echo "PDF erkannt"
fi
Die Anführungszeichen schützen den Pfadinhalt. Das zusätzliche -- verhindert, dass ein Dateiname mit führendem Bindestrich als Option interpretiert wird.
Mehrere Namen robust verarbeiten
find . -type f -print0 |
xargs -0 -r file --brief --mime-type --
-print0 und -0 erhalten Leerzeichen, Zeilenumbrüche und andere Sonderzeichen in Dateinamen. Für sicherheitskritische Entscheidungen reicht auch diese Verarbeitung nicht allein aus: Der Dateiinhalt kann absichtlich manipuliert sein.
Grenzen der Erkennung
- Bei leeren, beschädigten, verschlüsselten oder ungewöhnlichen Dateien kann kein eindeutiger Typ erkannt werden.
- Die Ausgabe
databedeutet meist, dass keine bekannte Signatur oder kein ausreichendes Erkennungsmerkmal gefunden wurde. - Bei Archiven und Kompressionen wird häufig nur der äußere Container erkannt. Der enthaltene Inhalt kann einen anderen Typ besitzen.
- Eine erkannte Textdatei ist nicht automatisch harmlos oder semantisch korrekt.
- Eine erkannte Kodierung beschreibt die wahrscheinliche Zeichenkodierung, garantiert aber nicht, dass jeder Text korrekt lesbar ist.
- Die Dateiendung und der tatsächliche Inhalt können voneinander abweichen.
- Ein Erkennungsergebnis ist eine Einschätzung anhand von Regeln, keine kryptografische Authentifizierung.
Fehlerbehebung
Die Ausgabe lautet nur data
Wahrscheinliche Ursachen sind eine unbekannte Signatur, ein beschädigtes oder verschlüsseltes Format, eine leere Datei oder ein proprietärer Dateityp.
- Dateigröße und Herkunft der Datei prüfen.
- Bei erwarteter Kompression
file -z DATEIversuchen. - Ein passendes Archivwerkzeug oder eine Hex-Analyse verwenden.
- Bei proprietären Formaten eine passende Magic-Datei mit
-mprüfen.
file meldet einen anderen Typ als die Endung
Die Datei wurde möglicherweise falsch benannt, absichtlich umbenannt oder mit einer unpassenden Endung gespeichert. Behandle den erkannten Inhaltstyp als wichtigeren Hinweis, prüfe die Herkunft und öffne die Datei nur mit geeigneten Schutzmaßnahmen.
Ein symbolischer Link wird nur als Link angezeigt
Das ist das erwartete Verhalten, wenn der Link selbst untersucht wird. Verwende file -L LINK, um das Ziel zu untersuchen. Bei einem defekten Link müssen Zielpfad und Existenz des Ziels geprüft werden.
Eine komprimierte Datei zeigt nur das äußere Format
Die Kompressionsschicht wird erkannt, der enthaltene Typ aber nicht vollständig ausgegeben. Versuche file -z DATEI, sofern das Format unterstützt wird. Alternativ kannst du die Datei in ein temporäres Verzeichnis entpacken und die enthaltenen Dateien separat prüfen.
Leerzeichen oder führende Bindestriche verursachen Fehler
Die Shell trennt unquotierte Argumente an Leerzeichen. Ein führender Bindestrich kann als Option interpretiert werden.
file "name mit leerzeichen"
file -- -datei
Prüfungsrelevante Merksätze
file DATEIuntersucht den wahrscheinlichen Typ anhand von Inhalt und Dateisystemmerkmalen, nicht nur anhand der Endung.- Magic Numbers sind charakteristische Bytefolgen, die Formatregeln zugeordnet werden können.
- Das erste erfolgreiche Erkennungsergebnis bestimmt üblicherweise die Ausgabe.
--mime-typeeignet sich für standardisierte Vergleiche in Skripten.-Lfolgt symbolischen Links; ohne diese Option kann der Link selbst beschrieben werden.--schützt vor Dateinamen, die mit einem Bindestrich beginnen.fileliefert Hinweise, aber keine vollständige Sicherheitsprüfung oder Integritätsgarantie.
Für weiterführende Untersuchungen kannst du Dateien zusätzlich mit ls, stat, find, strings oder passenden Archivwerkzeugen analysieren. Eine erkannte Dateibeschreibung sollte immer im Zusammenhang mit Herkunft, Berechtigungen und erwartetem Inhalt bewertet werden.