Der Befehl touch aktualisiert die Zugriffs- und Änderungszeitpunkte einer Datei. Existiert die Datei noch nicht, legt touch sie als leere Datei an — und genau dieser Nebeneffekt ist heute der häufigste Anwendungsfall. Ein einzelnes touch datei.txt erstellt im Alltag schneller eine leere Datei als jeder Editor.

Was touch macht

Ursprünglich war touch dafür gedacht, Zeitstempel zu manipulieren. Build-Werkzeuge wie make entscheiden anhand der Modification-Time (mtime), ob eine Datei neu kompiliert werden muss — touch war das Mittel, eine Datei „künstlich neu” zu machen, ohne ihren Inhalt anzufassen.

Heute überwiegt die zweite Funktion: Wenn die Zieldatei nicht existiert, legt touch sie als leere Datei an. Damit ist touch der schnellste Weg, eine Platzhalter-, Marker- oder Test-Datei zu erzeugen.

Bash Leere Datei anlegen
touch notizen.txt

Existiert notizen.txt bereits, ändert touch nur ihre Zeitstempel. Existiert sie nicht, wird sie mit Größe 0 angelegt — die Datei-Berechtigungen folgen der aktuellen umask.

Syntax und Optionen

Bash
touch [OPTION]... DATEI...
Parameter
-a

Aktualisiert nur die Access-Time (atime), nicht die Modification-Time.

-m

Aktualisiert nur die Modification-Time (mtime), nicht die Access-Time.

-c, --no-create

Legt keine Datei an, falls sie nicht existiert — schweigt einfach.

-t [[CC]YY]MMDDhhmm[.ss]

Setzt den Zeitstempel auf ein explizites Datum im numerischen Format.

-d STRING, --date=STRING

Setzt den Zeitstempel anhand eines flexiblen Datumsstrings (z. B. "2026-05-04 12:00" oder "yesterday").

-r REF, --reference=REF

Übernimmt die Zeitstempel von der Referenzdatei REF.

-h, --no-dereference

Wirkt auf den Symlink selbst, nicht auf das Ziel des Symlinks.

Bash Beispiel: Datum explizit setzen
touch -t 202605041200 notizen.txt
touch -d "2026-05-04 12:00:00" notizen.txt
touch -r vorlage.txt neu.txt

Die drei Zeitstempel

Jede Datei in einem Unix-Dateisystem hat drei Zeitstempel im Inode. touch schreibt aber nur in zwei davon direkt — der dritte (ctime) folgt automatisch.

ZeitstempelBedeutungWann wird er aktualisiert?
atime (access)Letzter lesender ZugriffBeim Öffnen/Lesen der Datei (siehe relatime)
mtime (modify)Letzte Änderung des InhaltsBeim Schreiben in die Datei
ctime (change)Letzte Änderung des InodesBei Änderungen an Berechtigungen, Owner, Größe — und wann immer atime/mtime geändert werden

Den vollständigen Satz Zeitstempel siehst du mit stat:

Bash Zeitstempel anzeigen
stat notizen.txt
Output
  File: notizen.txt
  Size: 0   Blocks: 0   IO Block: 4096   regular empty file
Access: 2026-05-04 12:00:00.000000000 +0200
Modify: 2026-05-04 12:00:00.000000000 +0200
Change: 2026-05-04 12:00:01.123456789 +0200

Der Detail-Artikel zu stat folgt — bis dahin liefert man stat alle Felder.

Mehrere Dateien gleichzeitig

touch akzeptiert beliebig viele Dateinamen als Argumente. Zusammen mit der Brace-Expansion der Shell entstehen daraus elegante Einzeiler:

Bash Mehrere Dateien
touch a.txt b.txt c.txt
touch file{1..10}.txt
touch test_{alpha,beta,gamma}.log
mkdir -p projekt && touch projekt/{README.md,LICENSE,.gitignore}

Die Brace-Expansion file{1..10}.txt wird vor dem Aufruf von touch durch die Shell zu file1.txt file2.txt ... file10.txt aufgelöst — touch selbst sieht nur die fertige Liste.

Praxis-Use-Cases

touch ist ein winziges Werkzeug mit überraschend vielen Einsatzfeldern.

Marker- und Lock-Dateien

Bash Lockfile als Synchronisationsanker
touch /tmp/import.lock
run_import.sh
rm /tmp/import.lock

Andere Skripte können mit [ -f /tmp/import.lock ] prüfen, ob gerade ein Import läuft. Achtung: Das ist kein sicheres Locking — siehe Insights.

Build-Trigger für Make

Bash Make zur Neukompilierung zwingen
touch src/main.c
make

make vergleicht mtimes. Wer eine Quelldatei „neuer” macht, löst die Neukompilierung des abhängigen Targets aus.

Test-Daten und Fixtures anlegen

Bash Schnell ein Test-Set bauen
mkdir testdata && touch testdata/{empty.txt,small.txt,large.txt}

Logfile rotieren — aber Vorsicht

touch legt nur eine Datei an oder aktualisiert ihre Zeitstempel. Zum echten Leeren eines Logs verwendet man die Shell-Redirection — die ist destruktiv:

Bash Truncate vs. touch
> app.log              # Truncate: Datei wird auf 0 Byte geleert
touch app.log          # Nur Zeitstempel — Inhalt bleibt unangetastet

Wichtige Verwandte

touch ist nicht der einzige Weg, eine Datei anzulegen. Die Alternativen unterscheiden sich darin, was sie tun, wenn die Datei bereits existiert:

BefehlVerhalten bei nicht-existenter DateiVerhalten bei existierender Datei
touch dateiLegt leere Datei anAktualisiert Zeitstempel, kein Truncate
> dateiLegt leere Datei anTruncate auf 0 Byte (zerstörerisch)
printf '' > dateiLegt leere Datei anTruncate auf 0 Byte
cat > dateiLegt Datei an, wartet auf STDINTruncate, dann Inhalt von STDIN
: > dateiLegt leere Datei anTruncate auf 0 Byte

Faustregel: Wenn du dir nicht sicher bist, ob die Zieldatei schon existiert, ist touch die sichere Wahl — es zerstört niemals Inhalt.

Besonderheiten

atime wird oft gar nicht mehr aktualisiert

Das klassische Verhalten — bei jedem Lesezugriff atime aktualisieren — kostet Schreib-I/O und ist auf modernen Systemen meist abgestellt. Die Mount-Optionen relatime (Default seit Kernel 2.6.30) und noatime reduzieren das auf das Nötigste oder schalten es ganz ab. Mit mount | grep atime siehst du, was bei dir aktiv ist. Wer auf atime wirklich angewiesen ist (z. B. Mailserver), muss bewusst strictatime setzen.

touch -d versteht natürliche Sprache

GNU touch nutzt intern parse_datetime aus den Coreutils und akzeptiert erstaunlich viele Formate: “yesterday”, “next friday”, “2 weeks ago”, “2026-05-04 12:00 +0200”. Praktisch für Test-Setups mit gezielten Zeitstempeln. Auf BSD-Systemen (macOS) fehlt diese Magie — dort gibt es nur das numerische -t-Format.

-t kollidiert nicht mit der Locale, -d aber schon

Das Format -t YYYYMMDDhhmm ist locale-unabhängig — es funktioniert überall identisch. -d hingegen interpretiert Strings teilweise locale-abhängig: “04/05/2026” kann je nach LC_TIME der 4. Mai oder der 5. April sein. ISO-8601-Format (“2026-05-04”) ist eindeutig und sollte in Skripten Pflicht sein.

touch -a ändert trotzdem ctime

Wer denkt, mit -a nur atime und nichts anderes zu berühren, irrt. Sobald sich irgendetwas im Inode ändert (auch ein Zeitstempel), zieht der Kernel die ctime nach — das ist gerade der Sinn von ctime. Es gibt kein Werkzeug, das ctime gezielt manipuliert; sie folgt immer einer anderen Änderung. Forensiker schätzen das, weil ctime damit fälschungsresistenter ist als atime und mtime.

Make-Idiom: touch $@ für Phony-Marker

In Makefiles ist touch $@ ein klassisches Idiom: Ein Target ohne echtes Output-Artefakt (z. B. build-deps) erzeugt eine leere Marker-Datei mit dem Target-Namen, damit make beim nächsten Lauf erkennt, dass der Schritt schon erledigt ist. Funktioniert nur, wenn das Target nicht in .PHONY steht — sonst wird es jedes Mal neu ausgeführt.

Race-Conditions bei Lockfiles mit touch

Das Muster [ -f /tmp/lock ] || touch /tmp/lock ist nicht atomar — zwischen Test und Anlegen kann ein anderer Prozess dieselbe Lockdatei erzeugen. Echte Locks brauchen flock(1), mkdir (atomar) oder ln auf einem festen Inode. touch als Marker ist okay; als Synchronisations-Primitive ist es eine Falle.

Weiterführende Ressourcen

Externe Quellen

/ Weiter

Zurück zu Dateisystem

Zur Übersicht