Wo ls -l nur eine kompakte Zeile mit Permissions, Größe und Zeitstempel liefert, packt stat alle Metadaten einer Datei aus: Inode-Nummer, Block-Anzahl, IO-Block-Größe, exakte Zeitstempel mit Nanosekunden-Auflösung, Device-Nummer, numerische und symbolische Permissions, Owner als Name und UID. Wenn du wissen willst, was der Kernel über eine Datei weiß, ist stat der direkteste Weg.
Was stat macht
stat ruft den stat(2)-Systemcall auf — denselben, den auch ls, find oder Dateimanager nutzen — und gibt das komplette Ergebnis lesbar aus. Im Hintergrund liest der Kernel den Inode der Datei, die zentrale Datenstruktur jedes Unix-Dateisystems, in der praktisch alle Eigenschaften einer Datei gespeichert sind außer dem Inhalt selbst und dem Dateinamen.
Damit unterscheidet sich stat von ls -l in zwei Punkten:
- Vollständigkeit — neben Größe, Owner und mtime auch Inode-Nummer, Blocks, Device-ID, Hardlink-Count und alle vier Zeitstempel.
- Format-Kontrolle — die Ausgabe lässt sich vollständig mit Specifier-Strings anpassen, ideal für Skripte.
Was die Ausgabe zeigt
Ein Aufruf von stat ohne Optionen liefert einen mehrzeiligen Block:
stat notes.txt File: notes.txt
Size: 1280 Blocks: 8 IO Block: 4096 regular file
Device: 259,2 Inode: 7864321 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ michael) Gid: ( 1000/ michael)
Access: 2026-05-04 09:12:33.482910120 +0200
Modify: 2026-05-03 18:04:11.221001000 +0200
Change: 2026-05-03 18:04:11.221001000 +0200
Birth: 2026-04-21 22:50:08.000000000 +0200Die einzelnen Zeilen im Detail:
| Feld | Bedeutung |
|---|---|
| File | Pfad/Name, mit dem stat aufgerufen wurde |
| Size | Größe der Datei in Bytes |
| Blocks | Belegte Datenblöcke (à 512 Byte, unabhängig vom IO-Block) |
| IO Block | Bevorzugte Block-Größe für I/O-Operationen |
| regular file | Datei-Typ (regular file, directory, symbolic link, character special file, block special file, socket, fifo) |
| Device | Major,Minor des Geräts, auf dem die Datei liegt |
| Inode | Eindeutige Inode-Nummer auf diesem Dateisystem |
| Links | Anzahl der Hardlinks auf diese Inode |
| Access (oktal) | Permissions in Oktal-Notation (z. B. 0644) |
| Access (symbolisch) | Permissions in symbolischer Form (z. B. -rw-r—r—) |
| Uid / Gid | Owner als numerische ID und als Name |
| Access | Letzter Lesezugriff (atime) |
| Modify | Letzte Inhaltsänderung (mtime) |
| Change | Letzte Änderung an Metadaten oder Inhalt (ctime) |
| Birth | Erstellungszeitpunkt (btime, falls vom Dateisystem unterstützt) |
Drei (vier) Zeitstempel
Unix kennt klassisch drei Zeitstempel pro Datei. Moderne Dateisysteme bringen einen vierten — die birth time — dazu. Welcher Stempel sich wann ändert:
| Stempel | Voller Name | Wird aktualisiert, wenn … |
|---|---|---|
| atime | Access time | Die Datei gelesen wird (cat, less, Editor-Open) |
| mtime | Modify time | Der Inhalt der Datei geändert wird |
| ctime | Change time | Inhalt oder Metadaten geändert werden (Permissions, Owner, Hardlinks) |
| btime | Birth time | Die Datei erstellt wird — danach unveränderlich |
Wichtig: ctime ist nicht „creation time” wie unter Windows, sondern „change time”. Der Stempel ändert sich auch bei chmod oder chown, ohne dass der Inhalt angetastet wird. Die echte Erstellungszeit ist btime, und die gibt es erst seit ext4, btrfs, xfs (mit aktivem crtime) und zfs.
Die atime-Aktualisierung ist auf vielen Systemen aus Performance-Gründen abgeschwächt: die Mount-Option relatime (heute Default) schreibt atime nur, wenn sie älter ist als mtime/ctime — das verhindert, dass jeder Lesezugriff einen Schreibvorgang auf die Inode auslöst.
Wichtige Optionen
| Option | Wirkung |
|---|---|
-c FORMAT, --format=FORMAT | Ausgabe nach Format-String, mit abschließendem Newline |
--printf=FORMAT | Wie -c, aber ohne Newline und mit Backslash-Escapes (\n, \t) |
-t, --terse | Knappe einzeilige Ausgabe — gut maschinenlesbar |
-L, --dereference | Symlinks folgen statt sie selbst zu beschreiben |
-f, --file-system | Statt der Datei das Dateisystem untersuchen |
--cached=MODE | Kontrolle über Stat-Caching (default, never, always) |
Die wichtigsten Format-Specifier für -c / --printf:
| Specifier | Bedeutung |
|---|---|
%n | Dateiname |
%s | Größe in Bytes |
%a | Permissions in Oktal (z. B. 644) |
%A | Permissions symbolisch (z. B. -rw-r—r—) |
%U / %u | Owner-Name / Owner-UID |
%G / %g | Group-Name / Group-GID |
%i | Inode-Nummer |
%h | Hardlink-Count |
%y / %Y | mtime menschenlesbar / mtime als Unix-Epoch |
%x / %X | atime menschenlesbar / atime als Unix-Epoch |
%z / %Z | ctime menschenlesbar / ctime als Unix-Epoch |
%w / %W | btime menschenlesbar / btime als Unix-Epoch |
%F | Datei-Typ (regular file, directory, symbolic link, …) |
stat -c '%n %s %a %U' notes.txtnotes.txt 1280 644 michaelstat -f — Filesystem-Info
Mit -f zeigt stat nicht die Eigenschaften der Datei, sondern die des Dateisystems, auf dem sie liegt: Block-Größe, Gesamtzahl Blöcke, freie Blöcke, freie Inodes, Filesystem-Type-ID.
stat -f /home File: "/home"
ID: a1b2c3d4e5f60718 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 122029568 Free: 41003254 Available: 34809211
Inodes: Total: 31064064 Free: 28115872Für eine reine Übersicht der Belegung ist df -h bequemer und auf höherem Level. stat -f ist die Wahl, wenn du den Type-Code brauchst, einzelne Block-Werte in Skripten verarbeiten oder die maximale Dateinamen-Länge (Namelen) auslesen willst.
Praxis-Beispiele
Inode finden, um über find -inum alle Hardlinks zu lokalisieren:
inode=$(stat -c '%i' wichtig.conf)
find / -xdev -inum "$inode" 2>/dev/nullmtime als Unix-Epoch — perfekt, um Dateien nach Alter zu sortieren oder Differenzen zu rechnen:
mtime=$(stat -c '%Y' backup.tar.gz)
echo $(( $(date +%s) - mtime ))Permissions-Bits oktal extrahieren — zum Beispiel, um vor chmod den Ist-Zustand zu prüfen oder zu sichern:
stat -c '%a' /etc/shadow640Besonderheiten
btime ist nicht überall verfügbar
Die Birth-Time gibt es nur, wenn das Dateisystem sie speichert. ext4 unterstützt sie (Feld crtime in der Inode), ext3 und ext2 nicht — dort meldet stat für Birth schlicht ein Minus-Zeichen oder einen leeren Wert. Auch btrfs, xfs (modern) und zfs haben btime, klassische Linux-Dateisysteme der ersten Generation nicht. Über statx(2) wird das Feld systemweit zugänglich gemacht.
GNU-stat ungleich BSD-stat
Der stat auf macOS und FreeBSD ist nicht GNU-stat. Optionen wie -c heißen dort schlicht -f (Format), und die Specifier sind komplett anders (%N, %z, %m). Ein GNU-Skript läuft unter macOS nur, wenn du coreutils aus Homebrew installierst und gstat aufrufst — oder direkt gstat in der Shebang einsetzt.
Symlinks ohne -L geben den Symlink selbst zurück
Ohne -L zeigt stat link die Eigenschaften des Symlinks: typischerweise sehr kleine Größe (Länge des Zielpfads), Typ symbolic link, Permissions oft 0777. Mit -L folgst du dem Link und siehst das Ziel. In Skripten ist das ein häufiger Stolperstein, wenn Size plötzlich 12 Byte ist statt der erwarteten Megabyte.
Inode-Nummern werden wiederverwendet
Wenn du dir eine Inode-Nummer als Identifikator merkst, sei vorsichtig: Wird die Datei gelöscht und eine neue erzeugt, kann der Kernel dieselbe Inode-Nummer wiederverwenden. Für stabile Identifikation kombinierst du Inode mit Device-ID (%i plus %d) — die beiden zusammen sind innerhalb eines laufenden Systems eindeutig.
%y vs %Y — formatierter String oder Epoch-Sekunden
Die Klein-/Großbuchstaben sind kein Tippfehler in der Doku. Kleinbuchstabe %y liefert das Datum menschenlesbar (2026-05-03 18:04:11.221001000 +0200), Großbuchstabe %Y denselben Zeitstempel als Sekunden seit Unix-Epoch. Dasselbe Muster gilt für %x/%X (atime), %z/%Z (ctime) und %w/%W (btime).
stat / zeigt die Wurzel-Inode des Dateisystems
Auf den meisten Linux-Dateisystemen hat / die Inode-Nummer 2 (ext-Familie) oder 64 (xfs). Das ist eine Konvention der Dateisystem-Designer und nützlich beim Debuggen — wenn stat / etwas anderes liefert, läuft auf der Wurzel ein ungewöhnliches Dateisystem (etwa overlayfs in Containern).
Weiterführende Ressourcen
Externe Quellen
- man-page stat(1) — Vollständige Optionen-Referenz
- GNU Coreutils: stat — Offizielle GNU-Dokumentation
- man-page stat(2) — Der zugrundeliegende Systemcall
- Arch Wiki: Inode — Hintergrund zu Inodes und Dateisystemen
- statx(2) manpage — Moderner Systemcall mit btime-Unterstützung
Verwandte Artikel
- file – Dateityp bestimmen — Was steckt wirklich in einer Datei?
- ls – Verzeichnisse auflisten — Kompakte Übersicht über Dateien und Attribute
- find – Dateien suchen — Suche nach Inode, Zeitstempel, Größe
- ln – Hard- und Symlinks — Mehrere Namen für eine Inode
- Berechtigungen — Permissions, Owner und das Unix-Sicherheitsmodell