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.
touch notizen.txtExistiert 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
touch [OPTION]... DATEI...-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.
touch -t 202605041200 notizen.txt
touch -d "2026-05-04 12:00:00" notizen.txt
touch -r vorlage.txt neu.txtDie 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.
| Zeitstempel | Bedeutung | Wann wird er aktualisiert? |
|---|---|---|
| atime (access) | Letzter lesender Zugriff | Beim Öffnen/Lesen der Datei (siehe relatime) |
| mtime (modify) | Letzte Änderung des Inhalts | Beim Schreiben in die Datei |
| ctime (change) | Letzte Änderung des Inodes | Bei Änderungen an Berechtigungen, Owner, Größe — und wann immer atime/mtime geändert werden |
Den vollständigen Satz Zeitstempel siehst du mit stat:
stat notizen.txt 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 +0200Der 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:
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
touch /tmp/import.lock
run_import.sh
rm /tmp/import.lockAndere 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
touch src/main.c
makemake vergleicht mtimes. Wer eine Quelldatei „neuer” macht, löst die Neukompilierung des abhängigen Targets aus.
Test-Daten und Fixtures anlegen
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:
> app.log # Truncate: Datei wird auf 0 Byte geleert
touch app.log # Nur Zeitstempel — Inhalt bleibt unangetastetWichtige Verwandte
touch ist nicht der einzige Weg, eine Datei anzulegen. Die Alternativen unterscheiden sich darin, was sie tun, wenn die Datei bereits existiert:
| Befehl | Verhalten bei nicht-existenter Datei | Verhalten bei existierender Datei |
|---|---|---|
touch datei | Legt leere Datei an | Aktualisiert Zeitstempel, kein Truncate |
> datei | Legt leere Datei an | Truncate auf 0 Byte (zerstörerisch) |
printf '' > datei | Legt leere Datei an | Truncate auf 0 Byte |
cat > datei | Legt Datei an, wartet auf STDIN | Truncate, dann Inhalt von STDIN |
: > datei | Legt leere Datei an | Truncate 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
- touch(1) – man7.org — Vollständige Manpage des GNU-touch
- GNU Coreutils: touch invocation — Offizielle Dokumentation aller Optionen
- Arch Wiki: File systems – atime/relatime — Mount-Optionen rund um atime im Detail
- Linux Kernel: VFS and timestamps — Wie der Kernel Zeitstempel im VFS verwaltet
Verwandte Artikel
- mkdir – Verzeichnisse anlegen — Das Pendant zu touch für Verzeichnisse
- rm – Dateien löschen — Was angelegt wurde, lässt sich auch wieder entfernen
- mv – Dateien verschieben und umbenennen — Das logische Gegenstück beim Aufräumen
- stat – Datei-Metadaten anzeigen — Alle drei Zeitstempel und Inode-Details
- ls – Dateien auflisten — Mit
ls -luundls -lcatime und ctime sehen