file — Dateityp anhand des Inhalts bestimmen

Mit file den echten Dateityp am Inhalt erkennen statt an der Endung — über Magic-Number-Muster, inklusive MIME-Typ, Encoding und Skript-Einsatz.

file bestimmt den Typ einer Datei nicht anhand ihrer Endung, sondern anhand ihres tatsächlichen Inhalts: Es liest charakteristische Bytefolgen am Dateianfang – die sogenannten Magic Numbers – und vergleicht sie mit einer Musterdatenbank. Dadurch erkennst du auch falsch oder gar nicht benannte Dateien zuverlässig, etwa ein PNG hinter der Endung .dat oder ein ausführbares ELF-Binary ohne Endung. Für Skripte gibst du mit --mime-type einen sauberen MIME-Typ aus, mit -i zusätzlich das Encoding und mit -b ohne den Dateinamen. So ist file das Mittel der Wahl, bevor du eine unbekannte Datei öffnest oder einen Upload weiterverarbeitest.

Grundlagen

file <datei> — Bestimmt den Typ einer Datei.

file document.pdf

file <datei1> <datei2> — Bestimmt mehrere Dateien auf einmal.

file *.bin

file -b <datei> — Kurzmodus: lässt den Dateinamen in der Ausgabe weg.

file -b image.png

file * — Bestimmt alle Dateien im aktuellen Verzeichnis.

file /usr/bin/*

MIME-Typen

file -i <datei> — Zeigt MIME-Typ und Encoding.

file -i script.py

file --mime-type <datei> — Zeigt nur den MIME-Typ.

file --mime-type photo.jpg

file --mime-encoding <datei> — Zeigt nur das MIME-Encoding (Zeichensatz).

file --mime-encoding data.csv

file -b --mime-type <datei> — Zeigt nur den MIME-Typ, ohne Dateinamen (nützlich in Skripten).

file -b --mime-type upload.dat

Optionen

file -z <datei> — Schaut in komprimierte Dateien hinein.

file -z archive.gz

file -L <symlink> — Folgt symbolischen Links.

file -L /usr/bin/python

file -s <gerät> — Liest block-/zeichenorientierte Spezialdateien (Geräte).

sudo file -s /dev/sda1

file -f <liste> — Liest Dateinamen aus einer Listendatei (einer pro Zeile).

file -f filelist.txt

file -k <datei> — Macht weiter: zeigt alle passenden Typen, nicht nur den ersten.

file -k mystery.bin

Besondere Eingaben

file - — Liest von stdin und bestimmt den Inhalt.

curl -s https://example.com | file -

echo '<daten>' | file - — Bestimmt durchgereichte Daten.

echo 'PK' | file -

file -b - < <datei> — Bestimmt umgeleitete Eingabe (Kurzmodus).

file -b - < unknown.dat

Häufige Muster

find . -type f -exec file {} + | grep 'text' — Findet rekursiv alle Textdateien.

find /var/log -type f -exec file {} + | grep 'text'

find . -type f -exec file {} + | grep 'ELF' — Findet alle ausführbaren Binärdateien.

find /usr/bin -type f -exec file {} + | grep 'ELF'

file -i * | grep 'charset=utf-8' — Findet alle UTF-8-kodierten Dateien.

file -i *.txt | grep 'charset=utf-8'

file * | grep -i image — Findet alle Bilddateien unabhängig von der Endung.

file uploads/* | grep -i image

for f in *; do echo "$f: $(file -b "$f")"; done — Eigene formatierte Auflistung der Dateitypen.

for f in downloads/*; do echo "$f: $(file -b "$f")"; done

Fazit

file ist das ehrliche Gegenstück zur Dateiendung: Es schaut in den Inhalt statt auf den Namen und sagt dir, was eine Datei wirklich ist. Im Alltag genügt oft der bloße Aufruf file datei; für Skripte und Pipelines lieferst du mit -b --mime-type einen sauberen, maschinenlesbaren MIME-Typ ohne Rauschen. In Kombination mit find -exec durchforstest du ganze Verzeichnisbäume nach Text, ELF-Binaries oder Bildern – unabhängig davon, wie die Dateien benannt sind. Bedenke dabei: file rät anhand von Heuristiken und kann sich täuschen, besonders bei sehr kleinen oder leeren Dateien. Für die reinen Metadaten greifst du zu stat, für den Verzeichnisüberblick zu ls und zum Aufspüren der Dateien zu find.

Verwandte Kommandos

  • stat – vollständige Datei-Metadaten anzeigen
  • ls – Verzeichnisinhalte auflisten
  • find – Dateien rekursiv suchen, oft mit file kombiniert