Linux · Tag 1 · Kapitel 09 von 12

Dateien & Ordner erstellen, kopieren, löschen

Jetzt verändern wir das Dateisystem. Wir lernen touch, mkdir, cp, mv und das gefährliche rm — und schauen uns mit file und stat an, was eigentlich in einer Datei steckt.

📚 Kapitel 09 ⏱️ ca. 35 min Lesezeit 🎯 Praxis
9.1

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:

ZeitstempelBedeutetBei ls -l
atime (access)letzter Lesezugriffnicht angezeigt
mtime (modify)letzte Inhalts-Änderungja — das ist die Default-Anzeige
ctime (change)letzte Status-Änderung (auch Rechte!)nicht angezeigt

Was macht touch wirklich?

bash
# 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
💡
Warum dann „touch“?

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.

9.2

mkdir — Verzeichnisse anlegen

Grundlage

mkdir = make directory. Erstellt ein oder mehrere Verzeichnisse.

bash
# 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}
💡
Profi-Tipp

mkdir -p sollte fast immer dein Reflex sein. Es schadet nie und rettet dich vor dem klassischen „Verzeichnis existiert nicht“-Fehler in Skripten.

9.3

cp — kopieren mit vielen Spielarten

Pflicht

cp = copy. Macht eine Kopie einer Datei oder eines Verzeichnisses. Syntax: cp QUELLE ZIEL.

Die wichtigsten Optionen

OptionWas sie bewirkt
-iInteractive — fragt vor Überschreiben
-vVerbose — zeigt jede kopierte Datei
-r bzw. -RRekursiv — für Verzeichnisse
-aArchive — kopiert mit allen Rechten, Symlinks, Zeitstempeln (Klassiker!)
-uUpdate — kopiert nur, wenn Quelle neuer als Ziel
-nkein Überschreiben — schweigt einfach
--backupvor Überschreiben Backup mit Tilde erstellen
-pPermissions + Zeitstempel beibehalten

Typische Anwendungen

bash
# 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
⚠️
Schrägstrich am Verzeichnis macht einen Unterschied

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.

9.4

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

bash
# Quelle und Ziel im selben Verzeichnis → Umbenennen
mv alter-name.txt neuer-name.txt

# Auch für Verzeichnisse
mv altes-projekt/ neues-projekt/

Verschieben

bash
# 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

-iInteractive: fragt vor Überschreiben
-vVerbose: zeigt jede Aktion
-nkein Überschreiben
-unur ersetzen, wenn Quelle neuer
--backupBackup vor Überschreiben anlegen
Schneller als cp + rm

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

9.5

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.

bash
# 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/
💀
Die berühmteste gefährliche Zeile der Welt

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 Schutz
  • rm -rf /home — löscht alle User-Daten
  • rm -rf /etc — kein bootfähiges System mehr
  • rm -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

bash
# 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

BefehlVerhalten
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.
🛡️
Sicherheits-Trick: Alias rm='rm -i'

Viele Distros (und viele Admins) setzen in ~/.bashrc einen Alias, damit jedes rm nachfragt:

~/.bashrc
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.

🕰️
Wussten Sie schon? — Versteckte Dateien sind ein Versehen

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

9.6

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

bash
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

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

9.7

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:

BefehlWofür?Wann nutzen?
cat dateikomplette Datei auf einmal ausgebenKleine Dateien (< 100 Zeilen)
less dateiDatei seitenweise anzeigen (mit Suche)Lange Logs, Manpages, /etc-Files
head dateierste 10 ZeilenErste Zeilen eines Logs ansehen
head -50 dateierste 50 ZeilenAnpassbare Anzahl
tail dateiletzte 10 ZeilenNeueste Logs
tail -f dateiDatei live mitlesenLogs in Echtzeit beobachten — Klassiker!

Mini-Demo

bash
# 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
📺
Lifesaver: tail -f

Wenn 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

Praxis

Drei kurze Aufgaben zum direkt eintippen. Im großen Lab in Kapitel 10 wird's dann ernst.

  1. Erstelle in deinem Home einen Ordner spielwiese, wechsle hinein und lege darin die Dateien a.txt, b.txt, c.txt in einem Befehl an.
  2. Kopiere a.txt zu a.bak, benenne b.txt in notizen.txt um.
  3. Lege mit mkdir -p die Struktur archiv/2024/{q1,q2,q3,q4} an. Prüfe das Ergebnis mit ls -R archiv/.
bash
# 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/
🧹
Aufräumen nach der Übung

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
  1. Wofür wurde touch ursprünglich erfunden — und was ist heute seine häufigste Verwendung?
  2. Welche Option brauchst du bei mkdir, um verschachtelte Pfade in einem Schritt anzulegen?
  3. Was unterscheidet cp -r src dst/ von cp -r src/ dst/?
  4. Linux kennt keinen eigenen „rename“-Befehl. Wie benennt man trotzdem um?
  5. Was passiert bei rm -rf /tmp /cache (mit dem fatalen Leerzeichen)?
  6. Was bewirken die Aliase rm='rm -i' und cp='cp -i'?
  7. Welcher Befehl zeigt dir, ob eine Datei eine Textdatei, ein Binary oder ein Bild ist — unabhängig von der Endung?
  8. Wofür benutzt man tail -f?
  1. touch wurde 1979 erfunden, um Zeitstempel zu verändern (für make). Heute am häufigsten benutzt, um leere Dateien zu erstellen — ein Seiteneffekt des Befehls.
  2. -p (für parents): mkdir -p a/b/c.
  3. Ohne trailing slash auf der Quelle: src landet als Unterverzeichnis IN dst (→ dst/src/). Mit trailing slash: nur der Inhalt von src wandert nach dst.
  4. Mit mv: mv altername neuername im selben Verzeichnis = Umbenennen.
  5. Das löscht zwei separate Pfade: /tmp und /cache. /tmp existiert und wird komplett geleert — sehr schmerzhaft, vor allem für laufende Dienste.
  6. Beide Aliase machen die Befehle interaktiv — sie fragen vor jeder Löschung bzw. Überschreibung nach. Klassischer Sicherheitsnetz-Trick.
  7. file (z.B. file /bin/ls) — er liest die Magic Number am Datei-Anfang.
  8. Eine Datei live mitzulesen — neue Zeilen erscheinen sofort am Bildschirm. Klassiker für Log-Überwachung in Echtzeit.