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 mit7F 45 4C 46, ZIP-Archive mit50 4B 03 04. - Sprach-Test — Wenn nichts Magisches passt, prüft
fileauf 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.
file urlaub.jpgurlaub.jpg: PDF document, version 1.7Wie 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:
| Pfad | Inhalt |
|---|---|
/etc/magic | Lokale, vom Admin gepflegte Ergänzungen |
/usr/share/file/magic.mgc | Vorkompilierte System-Datenbank (binär) |
/usr/share/misc/magic | Quellform der Regeln (textbasiert) |
~/.magic | Eigene 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
| Option | Wirkung |
|---|---|
-b, --brief | Nur den Typ ohne den Dateinamen ausgeben — ideal für Skripte |
-i, --mime | MIME-Typ und Encoding ausgeben (z. B. text/plain; charset=utf-8) |
--mime-type | Nur den MIME-Typ, ohne Encoding |
--mime-encoding | Nur das Encoding |
-s, --special-files | Auch Block-/Character-Devices lesen statt sie zu überspringen |
-z, --uncompress | In komprimierte Dateien hineinschauen (gzip, bzip2, xz) |
-L, --dereference | Symlinks folgen statt sie als Symlink zu melden |
-h, --no-dereference | Symlinks explizit nicht folgen (Default in vielen Distributionen) |
-k, --keep-going | Weiter testen und alle möglichen Treffer ausgeben |
-f LISTE | Dateinamen aus einer Liste lesen (eine pro Zeile) |
--extension | Mögliche Endungen für den erkannten Typ vorschlagen |
file -i notes.txtnotes.txt: text/plain; charset=utf-8Praxis
Encoding einer Textdatei prüfen — bevor du eine Datei in einer Pipeline weiterverarbeitest, lohnt sich ein Blick auf das Encoding:
file --mime-encoding bericht.csvMehrere Dateien filtern — file * zeigt für jede Datei im aktuellen Verzeichnis den Typ an. In Kombination mit grep lassen sich daraus Listen filtern:
file * | grep -i 'PNG image' | cut -d: -f1In Skripten — mit -b bekommst du nur den Typ ohne Dateinamen, was die Weiterverarbeitung vereinfacht:
if [ "$(file -b --mime-type "$1")" = "application/pdf" ]; then
echo "Eine PDF — wird verarbeitet."
fiKomprimierte Dateien — mit -z schaut file durch die Kompression hindurch:
file -z dump.sql.gzdump.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
dataoder 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
-zschautfilenicht in Archive hinein. - Verschlüsselte Daten — sehen für
fileaus wie zufälliges Rauschen und werden meist nur alsdataerkannt. - 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
- man-page file(1) — Vollständige Referenz aller Optionen
- libmagic / file – Projektseite — Quellcode, Changelog und Magic-Datenbank
- Arch Wiki: file — Praktische Beispiele und Distributions-Hinweise
- shared-mime-info – freedesktop.org — MIME-Datenbank für Desktop-Umgebungen
Verwandte Artikel
- stat – Datei-Metadaten anzeigen — Inode, Größe, Zeitstempel und Permissions im Detail
- ls – Verzeichnisse auflisten — Dateien und ihre Attribute anzeigen
- find – Dateien suchen — Dateien anhand von Name, Typ und Eigenschaften finden
- Linux Dateisystem — Übersicht über Dateisystem-Werkzeuge
- Berechtigungen — Das Unix-Sicherheitsmodell