# 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.

Source: https://www.jpkc.com/db/cheatsheets/files-text/file/

<!-- PROSE:intro -->
`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.
<!-- PROSE:intro:end -->

## Grundlagen

`file <datei>` — Bestimmt den Typ einer Datei.

```bash
file document.pdf
```

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

```bash
file *.bin
```

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

```bash
file -b image.png
```

`file *` — Bestimmt alle Dateien im aktuellen Verzeichnis.

```bash
file /usr/bin/*
```

## MIME-Typen

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

```bash
file -i script.py
```

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

```bash
file --mime-type photo.jpg
```

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

```bash
file --mime-encoding data.csv
```

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

```bash
file -b --mime-type upload.dat
```

## Optionen

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

```bash
file -z archive.gz
```

`file -L <symlink>` — Folgt symbolischen Links.

```bash
file -L /usr/bin/python
```

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

```bash
sudo file -s /dev/sda1
```

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

```bash
file -f filelist.txt
```

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

```bash
file -k mystery.bin
```

## Besondere Eingaben

`file -` — Liest von stdin und bestimmt den Inhalt.

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

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

```bash
echo 'PK' | file -
```

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

```bash
file -b - < unknown.dat
```

## Häufige Muster

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

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

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

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

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

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

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

```bash
file uploads/* | grep -i image
```

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

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

<!-- PROSE:outro -->
## 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`.

## Weiterführende Links

- [ubuntuusers-Wiki: file](https://wiki.ubuntuusers.de/file/) – deutschsprachige Einführung mit Beispielen und Hinweisen zu MIME-Typen
- [Wikipedia: file (Unix)](https://de.wikipedia.org/wiki/File_(Unix)) – Hintergrund zum Kommando und zum Magic-Number-Konzept
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [stat](https://www.jpkc.com/db/cheatsheets/files-text/stat/) – vollständige Datei-Metadaten anzeigen
- [ls](https://www.jpkc.com/db/cheatsheets/files-text/ls/) – Verzeichnisinhalte auflisten
- [find](https://www.jpkc.com/db/cheatsheets/files-text/find/) – Dateien rekursiv suchen, oft mit file kombiniert

