touch — eigentlich gar nicht zum Erstellen gedacht
Grundlage
Die meisten kennen touch als „den Befehl, der leere Dateien
erstellt“. Tatsächlich ist das nur ein Nebeneffekt. Der
eigentliche Zweck von touch ist: Zeitstempel verändern.
Jede Datei in Linux hat drei Zeitstempel:
| Zeitstempel | Bedeutet | Bei ls -l |
|---|---|---|
| atime (access) | letzter Lesezugriff | nicht angezeigt |
| mtime (modify) | letzte Inhalts-Änderung | ja — das ist die Default-Anzeige |
| ctime (change) | letzte Status-Änderung (auch Rechte!) | nicht angezeigt |
Was macht touch wirklich?
# Existiert die Datei NICHT? → wird leer erstellt
touch neue-datei.txt
# Existiert die Datei? → atime + mtime auf JETZT
touch alte-datei.txt
ls -l alte-datei.txt # Datum springt auf aktuelle Zeit
# Mehrere auf einmal
touch a.txt b.txt c.txt
# Mit Brace Expansion (Vorgriff Kapitel 11)
touch test{1..10}.txt # erstellt test1.txt bis test10.txt
# Bestimmten Zeitstempel setzen
touch -t 202401151200 datei.txt # 2024-01-15 12:00:00
touch -d "2023-12-24 18:00" datei.txt
Der Befehl wurde 1979 erfunden, weil make (das Build-Tool)
mtime nutzt, um zu entscheiden, ob etwas neu kompiliert werden muss. Wenn
du eine Datei „berühren“ wolltest, damit make sie als „verändert“ ansieht,
hieß das schon damals touchen. Erst Jahre später haben Leute
entdeckt: „Cool, das erstellt ja auch leere Dateien.“ Heute ist genau das
die häufigste Verwendung.
mkdir — Verzeichnisse anlegen
Grundlage
mkdir = make
directory. Erstellt ein oder mehrere Verzeichnisse.
# Einzelner Ordner
mkdir test
# Mehrere parallel
mkdir alpha beta gamma
# Verschachtelt — KLAPPT NICHT ohne -p!
mkdir projekte/2025/januar
# Fehler: projekte existiert nicht → mkdir verweigert
# Mit -p: alle Zwischenebenen anlegen
mkdir -p projekte/2025/januar
mkdir -p projekte/2025/februar
ls -R projekte/
# -p ist auch idempotent: kein Fehler bei existierendem Verzeichnis
mkdir -p test # macht nichts, wenn test schon existiert
# Mit Brace Expansion: ganze Strukturen in einer Zeile
mkdir -p projekte/2025/{januar,februar,maerz,april}
mkdir -p firma/{buchhaltung,it,personal}/{aktiv,archiv}
mkdir -p sollte fast immer dein Reflex sein. Es schadet nie
und rettet dich vor dem klassischen „Verzeichnis existiert nicht“-Fehler
in Skripten.
cp — kopieren mit vielen Spielarten
Pflicht
cp = copy. Macht eine
Kopie einer Datei oder eines Verzeichnisses. Syntax:
cp QUELLE ZIEL.
Die wichtigsten Optionen
| Option | Was sie bewirkt |
|---|---|
-i | Interactive — fragt vor Überschreiben |
-v | Verbose — zeigt jede kopierte Datei |
-r bzw. -R | Rekursiv — für Verzeichnisse |
-a | Archive — kopiert mit allen Rechten, Symlinks, Zeitstempeln (Klassiker!) |
-u | Update — kopiert nur, wenn Quelle neuer als Ziel |
-n | kein Überschreiben — schweigt einfach |
--backup | vor Überschreiben Backup mit Tilde erstellen |
-p | Permissions + Zeitstempel beibehalten |
Typische Anwendungen
# Datei → Datei (Kopie mit neuem Namen)
cp original.txt kopie.txt
# Datei → Verzeichnis (Kopie behält Namen)
cp notes.txt ~/backup/
# erzeugt: ~/backup/notes.txt
# Viele Dateien → Verzeichnis
cp *.txt ~/backup/
# Verzeichnis rekursiv
cp -r projekte/ backup-projekte/
# Mit Permissions, Owner, Zeitstempeln (Klassiker für Backups)
cp -a /etc /backup/etc-$(date +%F)
# Mit Bestätigung bei Überschreiben (sicher!)
cp -i wichtig.conf /etc/
# Mit Backup-Datei vor Überschreiben
cp --backup nginx.conf /etc/nginx/
# erzeugt /etc/nginx/nginx.conf~ als Backup
cp -r src dst/ kopiert src als
Unterverzeichnis IN dst. Ergebnis: dst/src/.
cp -r src/ dst/ kopiert den Inhalt von
src in dst. Ergebnis: dst/....
Der trailing slash auf der Quelle ändert das Verhalten.
mv — verschieben und umbenennen in einem
Pflicht
mv = move. Erfüllt zwei
Aufgaben gleichzeitig — Verschieben und Umbenennen. In Linux gibt es keinen
eigenen „rename“-Befehl in der Grundinstallation: man benennt um, indem man
eine Datei an denselben Ort mit anderem Namen verschiebt.
Umbenennen
# Quelle und Ziel im selben Verzeichnis → Umbenennen
mv alter-name.txt neuer-name.txt
# Auch für Verzeichnisse
mv altes-projekt/ neues-projekt/
Verschieben
# In anderes Verzeichnis verschieben
mv datei.txt ~/archiv/
# Mehrere Dateien in ein Verzeichnis
mv *.log ~/archiv/
# Verschieben + Umbenennen in einem Schritt
mv ~/Downloads/datei.txt ~/projekte/neuer-name.txt
Nützliche Optionen
-i | Interactive: fragt vor Überschreiben |
-v | Verbose: zeigt jede Aktion |
-n | kein Überschreiben |
-u | nur ersetzen, wenn Quelle neuer |
--backup | Backup vor Überschreiben anlegen |
cp + rmWenn Quelle und Ziel auf demselben Dateisystem liegen, ist mv
blitzschnell — nur ein Eintrag im Inode-Index wird geändert, die Daten selbst
bleiben auf der Disk. Über Dateisystem-Grenzen hinweg (z.B. von Disk auf
USB-Stick) muss es real kopieren und kann lange dauern.
rm — der gefährlichste Befehl überhaupt
VORSICHT
rm = remove. Löscht
Dateien. Hier gibt es keinen Papierkorb. Was du mit
rm löschst, ist weg. Endgültig. Es gibt keine Wiederherstellung
ohne Spezial-Tools.
# Einfache Datei löschen
rm datei.txt
# Mehrere
rm a.txt b.txt c.txt
rm *.log
# Verzeichnisse löschen — braucht -r (rekursiv)
rm -r altes-projekt/
# Mit Nachfrage (sicher!)
rm -i datei.txt
# rm: regular file 'datei.txt' entfernen? (y/n)
# Verbose: zeigt was gelöscht wird
rm -v *.tmp
# FORCE: keine Fragen, keine Fehler bei nicht-existierenden Dateien
rm -f *.tmp
# DIE Kombination: rekursiv + force
rm -rf altes-projekt/
sudo rm -rf / löscht alles, auf das du Schreibrechte hast —
also als root das komplette System. Aktuelle rm-Versionen
verweigern das ohne --no-preserve-root, aber:
rm -rf /*— umgeht den Schutzrm -rf /home— löscht alle User-Datenrm -rf /etc— kein bootfähiges System mehrrm -rf ~/— löscht dein gesamtes Home
Niemals rm -rf
tippen, ohne den Pfad zweimal zu prüfen. Erst recht nicht als root.
Klassiker-Falle: Leerzeichen vor dem Pfad
# Gewollt: alles in /tmp/cache löschen
rm -rf /tmp/cache
# Tippfehler! Leerzeichen nach /tmp:
rm -rf /tmp /cache
# → löscht /tmp UND /cache (= /cache wird erzeugt erst gar nicht gefunden)
# → kann je nach Inhalt katastrophal sein
# Ein Leerzeichen, ein Tag Arbeit weg.
Verzeichnisse: rmdir vs. rm -r
| Befehl | Verhalten |
|---|---|
rmdir leer/ | Löscht NUR ein leeres Verzeichnis. Fehler bei Inhalt. |
rm -r voll/ | Löscht das Verzeichnis und alles darin. |
rm -ri voll/ | Wie oben, aber fragt vor jeder Datei nach. |
rm='rm -i'Viele Distros (und viele Admins) setzen in ~/.bashrc einen
Alias, damit jedes rm nachfragt:
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
Auf Rocky ist das für root standardmäßig
aktiv, für normale User nicht. Wer es haben will, fügt obige Zeilen in
~/.bashrc ein und ruft danach source ~/.bashrc auf.
Wichtig: Verlasse dich nicht auf den Alias als einziges Sicherheitsnetz. Auf fremden Systemen (SSH zu Kollegenrechner) ist er nicht gesetzt. Tippe immer wachsam.
Dateien, die mit . beginnen (Dotfiles), sind in Linux
„versteckt“ — ls zeigt sie nicht ohne -a.
Wenig bekannt: das war ein Bug!
In den 1970er Bell Labs wollten die Entwickler,
dass ls die Einträge . und ..
(aktuelles und übergeordnetes Verzeichnis) ausblendet. Sie schrieben ein
kleines if-Statement: „überspringe alles, was mit Punkt anfängt“.
Damit waren versehentlich alle Dotfiles unsichtbar.
Das war zwar nicht so geplant, aber praktisch:
User-Konfigurationen wie .bashrc stören jetzt nicht beim
normalen ls. So wurde aus einem Bug ein Standard, der bis
heute existiert.
Quelle: Rob Pike (Bell Labs / Plan 9 / Go), 2012, „Dotfiles: a brief history“.
file und stat — was steckt drin?
Bonus
In Linux gibt es keine Dateiendungen-Pflicht. Eine Datei
script ohne .sh kann trotzdem ein Shell-Skript sein.
Wie findet man heraus, was wirklich drin ist?
file — verrät den Inhaltstyp
file /etc/hosts
# /etc/hosts: ASCII text
file /bin/ls
# /bin/ls: ELF 64-bit LSB pie executable, x86-64, ...
file /usr/share/icons/breeze/places/96/folder.svg
# ...: SVG Scalable Vector Graphics image
file image.jpg
# image.jpg: JPEG image data, baseline, ...
# Über alle Dateien eines Ordners
file /etc/*
file schaut auf die ersten Bytes einer Datei
(Magic Number) und entscheidet so den Typ — ohne sich auf die Endung zu
verlassen.
stat — Detail-Informationen
stat /etc/hosts
# Beispiel-Output:
# File: /etc/hosts
# Size: 158 Blocks: 8 IO Block: 4096 regular file
# Device: 802h/2050d Inode: 67108993 Links: 1
# Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
# Access: 2026-05-21 09:14:33.000000000 +0200
# Modify: 2024-11-08 13:51:01.000000000 +0100
# Change: 2024-11-08 13:51:01.000000000 +0100
# Birth: 2024-11-08 13:51:01.000000000 +0100
stat zeigt alles: Größe, Block-Layout, Inode-Nummer,
UID/GID, Rechte (numerisch und symbolisch) und alle vier Zeitstempel.
Dateien anschauen: cat, less, head, tail
Vorgriff
Diese Werkzeuge sind eigentlich für Tag 2 reserviert, aber du brauchst sie ständig — deshalb kurz angerissen:
| Befehl | Wofür? | Wann nutzen? |
|---|---|---|
cat datei | komplette Datei auf einmal ausgeben | Kleine Dateien (< 100 Zeilen) |
less datei | Datei seitenweise anzeigen (mit Suche) | Lange Logs, Manpages, /etc-Files |
head datei | erste 10 Zeilen | Erste Zeilen eines Logs ansehen |
head -50 datei | erste 50 Zeilen | Anpassbare Anzahl |
tail datei | letzte 10 Zeilen | Neueste Logs |
tail -f datei | Datei live mitlesen | Logs in Echtzeit beobachten — Klassiker! |
Mini-Demo
# Schnell mal die ersten und letzten 5 Zeilen
head -5 /etc/os-release
tail -5 /etc/os-release
# Langes Log seitenweise lesen (Space = Seite vor, q = beenden, / = suchen)
less /var/log/messages # benötigt evtl. sudo
# Datei live beobachten
sudo tail -f /var/log/secure
# Strg+C zum Beenden
tail -fWenn du an einem Webserver oder einer Anwendung debuggst, ist
sudo tail -f /var/log/nginx/error.log dein bester Freund. Du
siehst Fehler in Echtzeit, während du in einem anderen Terminal Anfragen
schickst. An Tag 3 vertiefen wir das.
Mini-Übungen — gleich mitmachen
PraxisDrei kurze Aufgaben zum direkt eintippen. Im großen Lab in Kapitel 10 wird's dann ernst.
- Erstelle in deinem Home einen Ordner
spielwiese, wechsle hinein und lege darin die Dateiena.txt,b.txt,c.txtin einem Befehl an. - Kopiere
a.txtzua.bak, benenneb.txtinnotizen.txtum. - Lege mit
mkdir -pdie Strukturarchiv/2024/{q1,q2,q3,q4}an. Prüfe das Ergebnis mitls -R archiv/.
# 1)
mkdir ~/spielwiese
cd ~/spielwiese
touch a.txt b.txt c.txt
# 2)
cp a.txt a.bak
mv b.txt notizen.txt
# 3)
mkdir -p archiv/2024/{q1,q2,q3,q4}
ls -R archiv/
Wenn du fertig bist:
cd ~ && rm -r spielwiese (vorher: doppelt
prüfen, dass du wirklich im Home bist mit pwd).
Kontrollfragen zum Kapitel
Selbst-Check- Wofür wurde
touchursprünglich erfunden — und was ist heute seine häufigste Verwendung? - Welche Option brauchst du bei
mkdir, um verschachtelte Pfade in einem Schritt anzulegen? - Was unterscheidet
cp -r src dst/voncp -r src/ dst/? - Linux kennt keinen eigenen „rename“-Befehl. Wie benennt man trotzdem um?
- Was passiert bei
rm -rf /tmp /cache(mit dem fatalen Leerzeichen)? - Was bewirken die Aliase
rm='rm -i'undcp='cp -i'? - Welcher Befehl zeigt dir, ob eine Datei eine Textdatei, ein Binary oder ein Bild ist — unabhängig von der Endung?
- Wofür benutzt man
tail -f?
touchwurde 1979 erfunden, um Zeitstempel zu verändern (fürmake). Heute am häufigsten benutzt, um leere Dateien zu erstellen — ein Seiteneffekt des Befehls.-p(für parents):mkdir -p a/b/c.- Ohne trailing slash auf der Quelle:
srclandet als Unterverzeichnis INdst(→dst/src/). Mit trailing slash: nur der Inhalt vonsrcwandert nachdst. - Mit
mv:mv altername neuernameim selben Verzeichnis = Umbenennen. - Das löscht zwei separate Pfade:
/tmpund/cache./tmpexistiert und wird komplett geleert — sehr schmerzhaft, vor allem für laufende Dienste. - Beide Aliase machen die Befehle interaktiv — sie fragen vor jeder Löschung bzw. Überschreibung nach. Klassischer Sicherheitsnetz-Trick.
file(z.B.file /bin/ls) — er liest die Magic Number am Datei-Anfang.- Eine Datei live mitzulesen — neue Zeilen erscheinen sofort am Bildschirm. Klassiker für Log-Überwachung in Echtzeit.