Der Befehl file beantwortet eine simple, aber wichtige Frage: Was ist das eigentlich für eine Datei? Anders als Windows verlässt sich Linux nicht auf die Dateiendung, sondern schaut in die Datei hinein. Anhand charakteristischer Byte-Muster — sogenannter Magic Numbers — erkennt file Bilder, Archive, Skripte, Binaries, Dokumente und vieles mehr, selbst wenn die Endung fehlt oder absichtlich falsch ist.

Was file macht

file untersucht den Inhalt einer Datei und versucht, ihren Typ zu bestimmen. Das passiert in mehreren Stufen:

  • Filesystem-Test — Ist es überhaupt eine reguläre Datei, ein Verzeichnis, ein Socket, ein Block-Device?
  • Magic-Test — Steht am Anfang (oder an einer bekannten Position) eine charakteristische Byte-Sequenz? PNG-Dateien beginnen mit 89 50 4E 47, ELF-Binaries mit 7F 45 4C 46, ZIP-Archive mit 50 4B 03 04.
  • Sprach-Test — Wenn nichts Magisches passt, prüft file auf Text und versucht das Encoding (UTF-8, ASCII, ISO-8859, UTF-16) sowie eventuell die Sprache (Skript, JSON, XML) zu raten.

Die Endung .jpg ist file egal — eine als urlaub.jpg umbenannte PDF wird trotzdem als PDF erkannt. Das macht das Werkzeug unverzichtbar bei unbekannten Dateien, in Forensik-Szenarien und in Skripten, die Eingaben validieren wollen.

Bash Klassischer Aufruf
file urlaub.jpg
Output
urlaub.jpg: PDF document, version 1.7

Wie file funktioniert

Hinter file steckt die Bibliothek libmagic. Diese liest eine kompilierte Magic-Datenbank ein und vergleicht Byte-Muster der zu prüfenden Datei mit hunderten Einträgen. Auf typischen Systemen liegt die Datenbank an folgenden Orten:

PfadInhalt
/etc/magicLokale, vom Admin gepflegte Ergänzungen
/usr/share/file/magic.mgcVorkompilierte System-Datenbank (binär)
/usr/share/misc/magicQuellform der Regeln (textbasiert)
~/.magicEigene Regeln pro Nutzer

Eine Magic-Regel sieht etwa so aus: An Offset 0 liegen die Bytes 89 50 4E 47 0D 0A 1A 0A, also wird die Datei als PNG image data ausgegeben. Trifft mehrere Regeln zu, gewinnt die spezifischste — file kann zum Beispiel zwischen einem generischen ZIP-Archiv und einem JAR, ODT oder DOCX unterscheiden, weil die alle ZIP-basiert sind, aber unterschiedliche Innenstrukturen haben.

Wenn keine Magic-Regel greift, fällt file auf eine Heuristik zurück: Sind die ersten paar tausend Bytes druckbarer Text? Welche Bytes kommen vor (UTF-8-Sequenzen, BOM, Steuerzeichen)? Lässt sich ein Shebang erkennen?

Wichtige Optionen

OptionWirkung
-b, --briefNur den Typ ohne den Dateinamen ausgeben — ideal für Skripte
-i, --mimeMIME-Typ und Encoding ausgeben (z. B. text/plain; charset=utf-8)
--mime-typeNur den MIME-Typ, ohne Encoding
--mime-encodingNur das Encoding
-s, --special-filesAuch Block-/Character-Devices lesen statt sie zu überspringen
-z, --uncompressIn komprimierte Dateien hineinschauen (gzip, bzip2, xz)
-L, --dereferenceSymlinks folgen statt sie als Symlink zu melden
-h, --no-dereferenceSymlinks explizit nicht folgen (Default in vielen Distributionen)
-k, --keep-goingWeiter testen und alle möglichen Treffer ausgeben
-f LISTEDateinamen aus einer Liste lesen (eine pro Zeile)
--extensionMögliche Endungen für den erkannten Typ vorschlagen
Bash MIME-Typ und Encoding ausgeben
file -i notes.txt
Output
notes.txt: text/plain; charset=utf-8

Praxis

Encoding einer Textdatei prüfen — bevor du eine Datei in einer Pipeline weiterverarbeitest, lohnt sich ein Blick auf das Encoding:

Bash Encoding einer Datei
file --mime-encoding bericht.csv

Mehrere Dateien filternfile * zeigt für jede Datei im aktuellen Verzeichnis den Typ an. In Kombination mit grep lassen sich daraus Listen filtern:

Bash Nur PNG-Dateien herausfiltern
file * | grep -i 'PNG image' | cut -d: -f1

In Skripten — mit -b bekommst du nur den Typ ohne Dateinamen, was die Weiterverarbeitung vereinfacht:

Bash Bedingung im Skript
if [ "$(file -b --mime-type "$1")" = "application/pdf" ]; then
    echo "Eine PDF — wird verarbeitet."
fi

Komprimierte Dateien — mit -z schaut file durch die Kompression hindurch:

Bash Inhalt eines gzip-Archivs erkennen
file -z dump.sql.gz
Output
dump.sql.gz: ASCII text (gzip compressed data, was "dump.sql", ...)

Grenzen

file ist eine Heuristik, kein Wahrsager. Ein paar Situationen, in denen das Werkzeug versagt oder zumindest wackelt:

  • Sehr neue oder exotische Formate — wenn libmagic die Magic-Sequenz noch nicht kennt, fällt das Ergebnis auf data oder den nächstbesten generischen Typ zurück.
  • Leere oder sehr kurze Dateien — eine Null-Byte-Datei liefert schlicht empty, ohne Aussage über den geplanten Typ.
  • Container in Container — eine als ZIP verpackte ODT-Datei in einem TAR-Archiv wird je nach Tiefe unterschiedlich gemeldet; ohne -z schaut file nicht in Archive hinein.
  • Verschlüsselte Daten — sehen für file aus wie zufälliges Rauschen und werden meist nur als data erkannt.
  • Falsche Magic-Bytes am Anfang — manche Dateien tarnen sich (etwa Polyglots), und Polyglot-Dateien können als völlig anderer Typ identifiziert werden, je nachdem, welche Regel zuerst greift.

Für sicherheitskritische Validierung reicht file nicht aus — dort braucht es echte Parser, die das Format vollständig prüfen.

Besonderheiten

file -bL für saubere Symlink-Auflösung

Beim Scripting will man oft den Typ des Ziels eines Symlinks, nicht den Hinweis “symbolic link to …”. Die Kombination file -bL pfad folgt dem Symlink (-L) und liefert den Typ ohne Dateinamen-Präfix (-b) — perfekt, um den Wert direkt einer Variable zuzuweisen.

file -i ist nicht xdg-mime query filetype

Beide liefern MIME-Typen, sind aber nicht austauschbar. file -i schaut in den Dateiinhalt und nutzt libmagic. xdg-mime query filetype greift auf die shared-mime-info-Datenbank zu und kombiniert Endung, Glob-Patterns und Magic-Tests nach freedesktop.org-Regeln. Resultat: file -i ist verlässlicher bei umbenannten Dateien, xdg-mime ist konsistent mit dem, was Desktop-Umgebungen anzeigen.

BSD-file weicht von GNU-file ab

macOS und FreeBSD bringen einen eigenen file-Port mit. Optionen wie --mime-type existieren, aber Default-Verhalten und Magic-Datenbank weichen ab. Skripte, die auf einer bestimmten Ausgabe-Form bestehen, sollten besser mit dem MIME-Typ statt mit der Beschreibung in Klartext arbeiten — der ist über Plattformen hinweg deutlich stabiler.

Eigene Magic-Regeln hinzufügen

Die Magic-Datenbank lässt sich erweitern. In ~/.magic oder /etc/magic legst du eigene Regeln im Klartext ab und kompilierst sie mit file -C -m ~/.magic zur .mgc-Form. So lassen sich proprietäre Firmenformate, eigene Dateicontainer oder seltene Spielstand-Formate sauber erkennen.

file -s zeigt sogar das Dateisystem auf einer Partition

Mit file -s /dev/sda1 liest file direkt vom Block-Device statt es zu überspringen. Das Ergebnis nennt Dateisystemtyp, Label und manchmal die UUID — praktisch, wenn blkid nicht verfügbar ist oder du dir nicht sicher bist, was auf einer Partition liegt.

Weiterführende Ressourcen

Externe Quellen

/ Weiter

Zurück zu Dateisystem

Zur Übersicht