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:

Bash stat-Ausgabe einer Textdatei
stat notes.txt
Output
  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 +0200

Die einzelnen Zeilen im Detail:

FeldBedeutung
FilePfad/Name, mit dem stat aufgerufen wurde
SizeGröße der Datei in Bytes
BlocksBelegte Datenblöcke (à 512 Byte, unabhängig vom IO-Block)
IO BlockBevorzugte Block-Größe für I/O-Operationen
regular fileDatei-Typ (regular file, directory, symbolic link, character special file, block special file, socket, fifo)
DeviceMajor,Minor des Geräts, auf dem die Datei liegt
InodeEindeutige Inode-Nummer auf diesem Dateisystem
LinksAnzahl 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 / GidOwner als numerische ID und als Name
AccessLetzter Lesezugriff (atime)
ModifyLetzte Inhaltsänderung (mtime)
ChangeLetzte Änderung an Metadaten oder Inhalt (ctime)
BirthErstellungszeitpunkt (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:

StempelVoller NameWird aktualisiert, wenn …
atimeAccess timeDie Datei gelesen wird (cat, less, Editor-Open)
mtimeModify timeDer Inhalt der Datei geändert wird
ctimeChange timeInhalt oder Metadaten geändert werden (Permissions, Owner, Hardlinks)
btimeBirth timeDie 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

OptionWirkung
-c FORMAT, --format=FORMATAusgabe nach Format-String, mit abschließendem Newline
--printf=FORMATWie -c, aber ohne Newline und mit Backslash-Escapes (\n, \t)
-t, --terseKnappe einzeilige Ausgabe — gut maschinenlesbar
-L, --dereferenceSymlinks folgen statt sie selbst zu beschreiben
-f, --file-systemStatt der Datei das Dateisystem untersuchen
--cached=MODEKontrolle über Stat-Caching (default, never, always)

Die wichtigsten Format-Specifier für -c / --printf:

SpecifierBedeutung
%nDateiname
%sGröße in Bytes
%aPermissions in Oktal (z. B. 644)
%APermissions symbolisch (z. B. -rw-r—r—)
%U / %uOwner-Name / Owner-UID
%G / %gGroup-Name / Group-GID
%iInode-Nummer
%hHardlink-Count
%y / %Ymtime menschenlesbar / mtime als Unix-Epoch
%x / %Xatime menschenlesbar / atime als Unix-Epoch
%z / %Zctime menschenlesbar / ctime als Unix-Epoch
%w / %Wbtime menschenlesbar / btime als Unix-Epoch
%FDatei-Typ (regular file, directory, symbolic link, …)
Bash Custom-Format
stat -c '%n %s %a %U' notes.txt
Output
notes.txt 1280 644 michael

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

Bash Filesystem-Info
stat -f /home
Output
  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: 28115872

Fü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:

Bash Inode auslesen und Hardlinks finden
inode=$(stat -c '%i' wichtig.conf)
find / -xdev -inum "$inode" 2>/dev/null

mtime als Unix-Epoch — perfekt, um Dateien nach Alter zu sortieren oder Differenzen zu rechnen:

Bash Unterschied zwischen jetzt und mtime in Sekunden
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:

Bash Aktuelle Permissions als Zahl
stat -c '%a' /etc/shadow
Output
640

Besonderheiten

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

/ Weiter

Zurück zu Dateisystem

Zur Übersicht