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.

TestgruppeWas geprüft wirdBeispiele für Ergebnisse
DateisystemtestsMetadaten und besondere Objekte des DateisystemsVerzeichnis, symbolischer Link, Gerät, FIFO oder Socket
Magic-Number-TestsCharakteristische Bytefolgen an bestimmten PositionenJPEG, PNG, PDF, ZIP, gzip oder ELF
Text- und SprachtestsLesbare Zeichen, Kodierung, Quelltextmerkmale und ShebangsASCII-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
DateiartMögliche ErkennungHinweis
TextdateiASCII textEinfacher Text mit ASCII-Zeichen
UTF-8-TextdateiUnicode text, UTF-8 textZeichenkodierung wurde als UTF-8 erkannt
Shell-Skriptshell script, ASCII text executableEin Shebang oder typische Skriptmerkmale wurden gefunden
JPEG- oder PNG-BildJPEG image data oder PNG image dataDas Bildformat wird über seine Signatur erkannt
PDF-DokumentPDF documentDie PDF-Signatur wurde erkannt
gzip- oder ZIP-Archivgzip compressed data oder Zip archive dataOft wird zunächst nur die Kompressions- oder Containerhülle angezeigt
ELF-ProgrammELF 64-bit ... executableELF ist ein übliches Linux-Format für Programme, Objektdateien und Bibliotheken
Symbolischer Linksymbolic link to ...Ohne -L wird der Link selbst beschrieben
VerzeichnisdirectoryDas Dateisystemobjekt ist ein Verzeichnis

Wichtige Optionen

OptionZweckTypischer Einsatz
-b beziehungsweise --briefDateinamen in der Ausgabe weglassenMaschinell weiterverarbeitbare Typbeschreibung
-i beziehungsweise --mimeMIME-Typ und Zeichenkodierung ausgebenBeispielsweise text/plain; charset=utf-8
--mime-typeNur den MIME-Typ ausgebenVergleich in Shell-Skripten
-L beziehungsweise --dereferenceSymbolischen Links folgenDen Typ des Linkziels untersuchen
-f DATEILISTEDateinamen aus einer Datei lesenViele Pfade zeilenweise prüfen
-z beziehungsweise --uncompressBei unterstützten komprimierten Dateien zusätzlich den entpackten Inhalt untersuchenKomprimierte Text- oder Programmdateien näher bestimmen
--Das Ende der Optionen markierenDateinamen 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 data bedeutet 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.

  1. Dateigröße und Herkunft der Datei prüfen.
  2. Bei erwarteter Kompression file -z DATEI versuchen.
  3. Ein passendes Archivwerkzeug oder eine Hex-Analyse verwenden.
  4. Bei proprietären Formaten eine passende Magic-Datei mit -m prü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 DATEI untersucht 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-type eignet sich für standardisierte Vergleiche in Skripten.
  • -L folgt symbolischen Links; ohne diese Option kann der Link selbst beschrieben werden.
  • -- schützt vor Dateinamen, die mit einem Bindestrich beginnen.
  • file liefert 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.