Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Dateisystem & Volumes

Dieses Kapitel behandelt fortgeschrittene Dateisystem-Operationen unter macOS: symbolische und harte Links, Datei-Metadaten, Volume-Management, Disk Images und Backup-Werkzeuge.

Links ermöglichen es, auf Dateien oder Verzeichnisse an mehreren Stellen im Dateisystem zu verweisen, ohne die Daten zu duplizieren.

Ein symbolischer Link (Symlink, Softlink) ist ein Verweis auf einen Pfad. Er funktioniert wie eine Verknüpfung und kann auf Dateien oder Verzeichnisse zeigen – auch über Dateisystemgrenzen hinweg.

Syntax:

ln -s ZIEL LINKNAME

Beispiele:

# Symlink auf eine Datei
ln -s ~/Documents/config.yaml ~/.config/app/config.yaml

# Symlink auf ein Verzeichnis
ln -s ~/Dropbox/Projekte ~/Projekte

# Symlink mit relativem Pfad
cd ~/bin
ln -s ../scripts/backup.sh backup

# Symlink in anderem Verzeichnis erstellen
ln -s /opt/homebrew/bin/python3 /usr/local/bin/python

Eigenschaften:

MerkmalSymbolischer Link
Verweist aufPfad (String)
Ziel gelöschtLink wird “broken” (toter Link)
Über Dateisysteme✅ Ja
Auf Verzeichnisse✅ Ja
Eigene Inode✅ Ja (eigene Datei)
Erkennungls -l zeigt l und ->

Symlink erkennen:

ls -l ~/Projekte
# lrwxr-xr-x  1 max  staff  20 Jan 15 10:30 Projekte -> Dropbox/Projekte

# Nur Symlinks anzeigen
ls -la | grep "^l"

# Mit file-Befehl
file ~/Projekte
# /Users/max/Projekte: symbolic link to Dropbox/Projekte

Ein harter Link ist ein zusätzlicher Verzeichniseintrag für dieselbe Datei (Inode). Die Datei existiert erst dann nicht mehr, wenn alle harten Links gelöscht wurden.

Syntax:

ln ZIEL LINKNAME

Beispiele:

# Harter Link auf Datei
ln original.txt hardlink.txt

# Beide zeigen auf dieselbe Inode
ls -li original.txt hardlink.txt
# 12345678 -rw-r--r--  2 max  staff  100 Jan 15 10:30 hardlink.txt
# 12345678 -rw-r--r--  2 max  staff  100 Jan 15 10:30 original.txt
#    ^-- gleiche Inode-Nummer        ^-- Link-Count = 2

Eigenschaften:

MerkmalHarter Link
Verweist aufInode (Daten direkt)
Ziel gelöschtLink funktioniert weiter
Über Dateisysteme❌ Nein
Auf Verzeichnisse❌ Nein (außer . und ..)
Eigene Inode❌ Nein (teilt Inode)
ErkennungLink-Count > 1

Einschränkungen unter macOS:

# Harte Links auf Verzeichnisse sind nicht erlaubt
ln /Users/max/Documents /Users/max/Docs
# ln: /Users/max/Documents: Is a directory

# Harte Links über Volumes hinweg nicht möglich
ln /Volumes/USB/file.txt ~/file.txt
# ln: /Volumes/USB/file.txt: Cross-device link

1.3 Unterschiede und Anwendungsfälle

Vergleichstabelle:

MerkmalSymbolischer LinkHarter Link
Verweist aufPfadnameInode
Eigene InodeJaNein
Funktioniert nach Löschen des OriginalsNein (broken)Ja
Über DateisystemeJaNein
Auf VerzeichnisseJaNein
PlatzbedarfMinimal (Pfad)Keiner (Eintrag)
Typische NutzungVerknüpfungen, AliaseBackups, Deduplizierung

Wann Symlinks verwenden:

  • Verknüpfungen zu Verzeichnissen
  • Links über verschiedene Volumes/Partitionen
  • Wenn der Link als “Verweis” erkennbar sein soll
  • Konfigurationsdateien an mehreren Orten verfügbar machen
  • Versionierte Verzeichnisse (z.B. current -> v2.1.0)

Wann harte Links verwenden:

  • Backup-Systeme (Time Machine nutzt harte Links)
  • Deduplizierung von Dateien
  • Wenn die Datei auch nach Löschen des “Originals” erhalten bleiben soll
  • Space-effiziente Kopien

Beispiel: Versionierung mit Symlinks:

# Versionen als Verzeichnisse
mkdir -p ~/apps/myapp-1.0.0 ~/apps/myapp-1.1.0 ~/apps/myapp-2.0.0

# Symlink auf aktuelle Version
ln -s ~/apps/myapp-2.0.0 ~/apps/myapp-current

# Update auf neue Version
rm ~/apps/myapp-current
ln -s ~/apps/myapp-2.1.0 ~/apps/myapp-current

# Oder mit ln -sf (force)
ln -sf ~/apps/myapp-2.1.0 ~/apps/myapp-current

readlink – Linkziel auslesen:

# Symlink-Ziel anzeigen
readlink ~/Projekte
# Dropbox/Projekte

# Kanonischen (absoluten) Pfad auflösen
readlink -f ~/Projekte
# /Users/max/Dropbox/Projekte

# Auch für nicht existierende Pfade
readlink -f ./relative/path/../file.txt
# /Users/max/current/file.txt

Optionen:

OptionBeschreibung
-fKanonischer Pfad (alle Symlinks auflösen)
-nKeine Newline am Ende

unlink – Link entfernen:

# Symlink entfernen (nicht das Ziel!)
unlink ~/Projekte

# Äquivalent zu rm für einzelne Dateien
rm ~/Projekte

caution

Bei Verzeichnis-Symlinks keinen Trailing Slash verwenden!

# RICHTIG: Entfernt den Symlink
rm ~/Projekte

# FALSCH: Versucht Inhalt des Zielverzeichnisses zu löschen!
rm -r ~/Projekte/

Der Trailing Slash (/) bewirkt, dass die Shell den Symlink auflöst und dem Befehl das Zielverzeichnis übergibt. Mit rm -r ~/Projekte/ löscht man daher nicht den Symlink, sondern den Inhalt des verlinkten Verzeichnisses – ein häufiger und folgenschwerer Fehler.

Links finden:

# Alle Symlinks in einem Verzeichnis
find ~/Documents -type l

# Broken Symlinks finden
find ~/Documents -type l ! -exec test -e {} \; -print

# Alle harten Links zu einer Datei finden (gleiche Inode)
find / -inum $(stat -f %i datei.txt) 2>/dev/null

Link-Informationen mit stat:

# Inode und Link-Count anzeigen
stat -f "Inode: %i, Links: %l" datei.txt

# Bei Symlinks: Link vs. Ziel
stat -f "Link: %N, Ziel: %Y" ~/Projekte

2 Dateisystem-Tools

2.1 stat – Detaillierte Datei-Informationen

stat zeigt umfassende Metadaten einer Datei an.

Syntax:

stat [Optionen] DATEI

Standardausgabe:

stat ~/.zshrc
# 16777220 8453123 -rw-r--r-- 1 max staff 0 2048 "Jan 15 10:30:00 2024" ...

Formatierte Ausgabe (macOS BSD-stat):

# Lesbare Ausgabe
stat -x ~/.zshrc

# Bestimmte Felder
stat -f "%N: %z Bytes, modified %Sm" ~/.zshrc
# .zshrc: 2048 Bytes, modified Jan 15 10:30:00 2024

# Nur Dateigröße
stat -f %z ~/.zshrc
# 2048

# Nur Inode
stat -f %i ~/.zshrc
# 8453123

# Berechtigungen oktal
stat -f %Op ~/.zshrc
# 100644

# Besitzer und Gruppe
stat -f "%Su:%Sg" ~/.zshrc
# max:staff

Format-Spezifizierer (BSD/macOS):

SpezifiziererBeschreibung
%NDateiname
%zGröße in Bytes
%iInode-Nummer
%lAnzahl harter Links
%OpBerechtigungen (oktal)
%SpBerechtigungen (symbolisch)
%SuBesitzer (Name)
%SgGruppe (Name)
%uBesitzer (UID)
%gGruppe (GID)
%SaZugriffszeit
%SmÄnderungszeit
%ScStatusänderungszeit
%SBErstellungszeit (macOS)
%YSymlink-Ziel
%TDateityp

Beispiele:

# Erstellungsdatum (macOS-spezifisch)
stat -f "Erstellt: %SB" -t "%Y-%m-%d %H:%M" ~/.zshrc

# Vergleich zweier Dateien
for f in file1.txt file2.txt; do
    stat -f "%N: %z Bytes, %Sm" "$f"
done

# Alle Infos für Skript
stat -f "size=%z;inode=%i;mode=%Op;uid=%u;gid=%g" datei.txt

2.2 file – Dateityp erkennen

file analysiert den Inhalt einer Datei und bestimmt ihren Typ – unabhängig von der Dateiendung.

Syntax:

file [Optionen] DATEI...

Beispiele:

file document.pdf
# document.pdf: PDF document, version 1.7

file image.png
# image.png: PNG image data, 1920 x 1080, 8-bit/color RGBA

file script.sh
# script.sh: Bourne-Again shell script, ASCII text executable

file binary
# binary: Mach-O 64-bit executable arm64

file archive.tar.gz
# archive.tar.gz: gzip compressed data

file unknown
# unknown: ASCII text, with very long lines

Optionen:

OptionBeschreibung
-bBrief: Kein Dateiname in Ausgabe
-iMIME-Typ ausgeben
-IMIME-Typ mit Encoding
-LSymlinks folgen
-zKomprimierte Dateien untersuchen

Anwendungen:

# MIME-Typ für Webserver
file -I document.pdf
# document.pdf: application/pdf; charset=binary

# Mehrere Dateien
file *
# bild.jpg:    JPEG image data
# script.py:   Python script, ASCII text
# data.json:   JSON data

# In Skripten: Typ prüfen
if file -b "$1" | grep -q "shell script"; then
    echo "Ist ein Shell-Skript"
fi

# Nur echte Bilder finden
find . -type f -exec file {} \; | grep "image data"

2.3 mdls – macOS-Metadaten anzeigen

mdls zeigt Spotlight-Metadaten einer Datei an. Diese umfassen weit mehr als Standard-Dateiattribute.

Syntax:

mdls [Optionen] DATEI

Beispiel:

mdls foto.jpg
# kMDItemContentType         = "public.jpeg"
# kMDItemContentTypeTree     = (
#     "public.jpeg",
#     "public.image",
#     "public.data"
# )
# kMDItemDateTimeOriginal    = 2024-01-15 10:30:00 +0000
# kMDItemPixelHeight         = 1080
# kMDItemPixelWidth          = 1920
# kMDItemColorSpace          = "RGB"
# ...

Bestimmte Attribute abfragen:

# Nur bestimmtes Attribut
mdls -name kMDItemContentType foto.jpg
# kMDItemContentType = "public.jpeg"

# Mehrere Attribute
mdls -name kMDItemPixelWidth -name kMDItemPixelHeight foto.jpg

# Wert ohne Attributnamen
mdls -raw -name kMDItemPixelWidth foto.jpg
# 1920

Wichtige Metadaten-Attribute:

AttributBeschreibung
kMDItemContentTypeUTI-Dateityp
kMDItemKindLesbare Typbeschreibung
kMDItemFSNameDateiname
kMDItemFSSizeDateigröße
kMDItemFSCreationDateErstellungsdatum
kMDItemContentCreationDateInhalt erstellt
kMDItemContentModificationDateInhalt geändert
kMDItemPixelWidth/HeightBildgröße
kMDItemDurationSecondsMedien-Dauer
kMDItemTitleTitel
kMDItemAuthorsAutoren
kMDItemWhereFromsDownload-URL

Praktische Beispiele:

# Bildabmessungen
mdls -name kMDItemPixelWidth -name kMDItemPixelHeight *.jpg

# Woher wurde Datei heruntergeladen?
mdls -name kMDItemWhereFroms ~/Downloads/installer.dmg

# Dauer eines Videos
mdls -raw -name kMDItemDurationSeconds video.mp4

# Alle PDFs mit Seitenzahl
for f in *.pdf; do
    pages=$(mdls -raw -name kMDItemNumberOfPages "$f" 2>/dev/null)
    echo "$f: $pages Seiten"
done

Metadaten setzen mit xattr:

# Extended Attributes anzeigen
xattr -l datei.txt

# Quarantäne-Flag entfernen (heruntergeladene Dateien)
xattr -d com.apple.quarantine datei.app

# Alle xattrs entfernen
xattr -c datei.txt

3 Volumes & Mounten

3.1 diskutil – Laufwerke verwalten

diskutil ist das zentrale macOS-Tool zur Verwaltung von Festplatten, Partitionen und Volumes.

Laufwerke auflisten:

# Alle Laufwerke
diskutil list

# Ausgabe:
# /dev/disk0 (internal, physical):
#    #:                       TYPE NAME                    SIZE
#    0:      GUID_partition_scheme                        *500.1 GB
#    1:                        EFI EFI                     209.7 MB
#    2:                 Apple_APFS Container disk1         499.9 GB
#
# /dev/disk1 (synthesized):
#    #:                       TYPE NAME                    SIZE
#    0:      APFS Container Scheme -                      +499.9 GB
#    1:                APFS Volume Macintosh HD            12.4 GB
#    2:                APFS Volume Preboot                 23.1 MB
#    ...

Volume-Informationen:

# Detaillierte Infos zu einem Volume
diskutil info /dev/disk1s1

# Infos über Mount-Point
diskutil info /Volumes/USB

# Nur bestimmte Info
diskutil info /dev/disk1s1 | grep "Volume Name"

Volumes ein- und aushängen:

# Volume aushängen
diskutil unmount /Volumes/USB
diskutil unmount /dev/disk2s1

# Volume einhängen
diskutil mount /dev/disk2s1

# Alle Volumes eines Laufwerks aushängen
diskutil unmountDisk /dev/disk2

# Laufwerk sicher auswerfen
diskutil eject /dev/disk2

Partitionen und Formatierung:

# Volume löschen (APFS)
diskutil eraseVolume APFS "NeuesVolume" /dev/disk2s1

# Ganzes Laufwerk formatieren (ACHTUNG!)
diskutil eraseDisk APFS "MeinDisk" /dev/disk2

# Verfügbare Dateisystem-Typen
diskutil listFilesystems

# Partition hinzufügen (APFS Container)
diskutil apfs addVolume disk1 APFS "Daten"

APFS-spezifische Befehle:

# APFS Container auflisten
diskutil apfs list

# Volume zu Container hinzufügen
diskutil apfs addVolume disk1 APFS "NeuesVolume"

# Volume löschen
diskutil apfs deleteVolume disk1s3

# Volume umbenennen
diskutil rename disk1s2 "Neuer Name"

Festplatten reparieren:

# Dateisystem prüfen
diskutil verifyVolume /dev/disk1s1

# Dateisystem reparieren
diskutil repairVolume /dev/disk1s1

# First Aid (GUI-Äquivalent)
diskutil verifyDisk /dev/disk0
diskutil repairDisk /dev/disk0

3.2 mount / umount – Volumes ein-/aushängen

Die klassischen Unix-Befehle mount und umount funktionieren auch unter macOS.

Aktuelle Mounts anzeigen:

# Alle gemounteten Volumes
mount

# Nur bestimmter Typ
mount | grep apfs
mount | grep nfs

# Übersichtlicher mit df
df -h

Volume manuell mounten:

# Mount-Point erstellen
sudo mkdir /Volumes/MeinUSB

# Volume mounten
sudo mount -t msdos /dev/disk2s1 /Volumes/MeinUSB

# Mit Optionen
sudo mount -t hfs -o ro /dev/disk2s1 /Volumes/ReadOnly

Volume aushängen:

# Normal aushängen
sudo umount /Volumes/MeinUSB

# Erzwingen (wenn "busy")
sudo umount -f /Volumes/MeinUSB

# Besser: diskutil verwenden
diskutil unmount /Volumes/MeinUSB

Mount-Optionen:

OptionBeschreibung
-t TYPEDateisystem-Typ (apfs, hfs, msdos, ntfs, nfs, smbfs)
-o roRead-only
-o rwRead-write
-o noexecKeine Ausführung erlauben
-o nosuidSetuid ignorieren

3.3 Netzlaufwerke mounten (SMB, NFS, AFP)

SMB/CIFS (Windows-Freigaben):

# Mit mount_smbfs
mount_smbfs //user@server/share /Volumes/Share

# Mit Passwort (unsicher, besser Keychain nutzen)
mount_smbfs //user:passwort@server/share /Volumes/Share

# Über Finder-URL (öffnet Finder)
open smb://server/share

# Mount-Point vorbereiten
mkdir -p /Volumes/NAS
mount_smbfs //max@nas.local/Daten /Volumes/NAS

NFS:

# NFS-Mount
sudo mount -t nfs server:/export/share /Volumes/NFS

# Mit Optionen
sudo mount -t nfs -o resvport,rw server:/share /Volumes/NFS

# NFS-Exports auf Server anzeigen
showmount -e server

AFP (Apple Filing Protocol, veraltet):

# AFP-Mount
mount_afp afp://user@server/share /Volumes/AFP

# Über Finder
open afp://server/share

WebDAV:

# WebDAV mounten
mount_webdav https://server/dav /Volumes/WebDAV

Netzlaufwerk per Skript verbinden:

#!/bin/zsh
# mount-nas.sh

SERVER="nas.local"
SHARE="Daten"
USER="max"
MOUNTPOINT="/Volumes/NAS"

# Mount-Point erstellen falls nötig
[-d "$MOUNTPOINT"](-d%20"$MOUNTPOINT".md) || mkdir -p "$MOUNTPOINT"

# Prüfen ob bereits gemountet
if mount | grep -q "$MOUNTPOINT"; then
    echo "Bereits verbunden"
    exit 0
fi

# Mounten (Passwort aus Keychain)
mount_smbfs "//${USER}@${SERVER}/${SHARE}" "$MOUNTPOINT"

if [$? -eq 0]($?%20-eq%200.md); then
    echo "Erfolgreich verbunden: $MOUNTPOINT"
else
    echo "Fehler beim Verbinden"
    exit 1
fi

3.4 /etc/fstab – Automatisches Mounten

Die Datei /etc/fstab definiert Volumes, die beim Systemstart automatisch gemountet werden.

Syntax:

DEVICE  MOUNTPOINT  FSTYPE  OPTIONS  DUMP  PASS

Beispiele:

# /etc/fstab bearbeiten
sudo nano /etc/fstab
# NFS-Share beim Start mounten
server:/export/data  /Volumes/Data  nfs  rw,resvport  0  0

# SMB-Share (mit Benutzername)
//user@server/share  /Volumes/Share  smbfs  -N  0  0

# USB-Laufwerk nach UUID
UUID=1234-5678  /Volumes/USB  msdos  rw  0  0

# Volume read-only mounten
LABEL=Backup  /Volumes/Backup  apfs  ro  0  0

UUID ermitteln:

diskutil info /dev/disk2s1 | grep "Volume UUID"

fstab neu einlesen:

sudo automount -vc

note

macOS verwendet primär /etc/auto_master für Automounts. Für Netzlaufwerke ist oft ein Login-Item oder launchd-Job praktischer.

Automatisches Mounten mit launchd:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.mount-nas</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/mount_smbfs</string>
        <string>//user@server/share</string>
        <string>/Volumes/NAS</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>WatchPaths</key>
    <array>
        <string>/etc/resolv.conf</string>
    </array>
</dict>
</plist>

4 Disk Images & Sparse Files

Disk Images sind Container-Dateien, die ein virtuelles Dateisystem enthalten. Unter macOS sind sie allgegenwärtig für Software-Verteilung, verschlüsselte Container und Backups.

Typen von Disk Images:

TypEndungBeschreibung
Read-only.dmgKomprimiert, nicht veränderbar
Read/write.dmgVeränderbar, feste Größe
Sparse.sparseimageWächst bei Bedarf
Sparse Bundle.sparsebundleWächst, besteht aus Bändern
DVD/CD Master.cdrFür Brennen

Sparse Files:

Ein Sparse File belegt nur so viel Platz wie tatsächlich geschriebene Daten:

# Sparse File erstellen (10GB logisch, 0 Bytes real)
dd if=/dev/zero of=sparse.img bs=1 count=0 seek=10G

# Tatsächliche vs. logische Größe
ls -lh sparse.img    # zeigt 10G
du -h sparse.img     # zeigt 0B (oder wenige KB)

# Mit stat
stat -f "Logisch: %z, Blöcke: %b" sparse.img

5 Erweiterte Datei- und Backupwerkzeuge

In diesem Kapitel geht es um Befehle, mit denen man ganze Verzeichnisse oder Datenbestände effizient kopieren, klonen oder synchronisieren kannst.

Während einfache Kopierbefehle wie cp für einzelne Dateien ausreichen, sind ditto und rsync leistungsfähige Werkzeuge für komplexere Aufgaben, wie beispielsweise die Erstellung von Backups, der Übertragung großer Datenmengen oder beim der Spiegelung von Ordnern inklusive Berechtigungen, Metadaten und versteckten Dateien.

5.1 cp – Der klassische Kopierbefehl

cp ist der einfachste Befehl zum Kopieren von Dateien oder Verzeichnissen. Mit der Option -R (rekursiv) kopiert er auch Unterordner.

Beispiel:

cp -R Quelle Ziel

Verwendung:

Für schnelle, einfache Kopiervorgänge, etwa einzelne Dateien oder kleine Ordner.

Vorteile:

  • immer verfügbar, sehr einfach
  • Schnell bei wenigen Dateien

Nachteile:

  • Keine Fortschrittsanzeige
  • Keine Synchronisation
  • Kopiert oft keine versteckten Metadaten
  • Keine Option zum Erstellen von Archiven

5.2 ditto – Systemgerechtes Kopieren und Archivieren

Mit dem Befehl ditto werden Verzeichnisse kopiert/dupliziert.

note

Im Gegensatz zu cp kann ditto Ressourcendateien, Metadaten, Rechte, unsichtbare Dateien und Paketstrukturen (z. B. App-Bundles) korrekt handhaben.

Syntax:

ditto [Optionen] Quelle Ziel

Verwendung:

Ideal zum Klonen von Projekten, App-Bundles oder Backups auf demselben System. Auch nützlich zum Erstellen von ZIP-Archiven mit -c -k.

Vorteile:

  • Bewahrt Metadaten, ACLs, Ressourcen
  • Zusammenführen statt stumpfem Überschreiben
  • Kann ZIP-Archive erstellen
  • macOS-optimiert

Nachteile:

  • Arbeitet nur lokal (kein Netzwerktransfer)
  • Weniger effizient bei großen oder häufigen Synchronisationen

5.2.1 Beispiele

Ordner vollständig kopieren (inklusive versteckter Dateien wie .DS_Store und .git):

ditto ~/Projekte/ProjektA ~/Backup/ProjektA

Eine App korrekt klonen (inkl. Metadaten):

sudo ditto /Applications/App.app /Applications/App-Kopie.app

Nur neue oder geänderte Dateien kopieren:

ditto --update ~/Projekte/ ~/Backup/Projekte/

Eine ZIP-Datei aus einem Ordner erzeugen:

ditto -c -k --sequesterRsrc --keepParent "MeinOrdner" "MeinOrdner.zip"

→ Erstellt ein ZIP-Archiv, das auch Ressourcendateien und Metadaten beibehält.

5.2.2 Häufige Optionen

OptionBedeutung
--updateNur neuere Dateien kopieren
--norsrcRessourcen-Forks nicht mitkopieren
--rsrcRessourcen-Forks mitkopieren (Standardverhalten)
-VZeigt detaillierte Ausgaben (Verbose-Modus)
-XBewahrt erweiterte Attribute (ACLs, Metadaten)
-c -kErstellt ein ZIP-Archiv
--sequesterRsrc --keepParentErhält Ressourcen und übergeordnete Ordnerstruktur beim Archivieren

5.2.3 Typische Anwendungsfälle

  • Vollständige Kopien von App-Bundles, Projekten oder Verzeichnissen unter Beibehaltung macOS-spezifischer Dateiattribute (z. B. ACLs, HFS+ Metadaten)
  • Erstellung von Backups und ZIP-Archiven
  • Zusammenführen von Ordnern mit Erhalt von Metadaten
  • Alternative zu cp -R mit besserer macOS-Kompatibilität
  • Installer-Skripte und Backup-Tools

5.3 rsync – Effiziente Synchronisation und Spiegelung

Der Befehl rsync wird verwendet, um Dateien und Verzeichnisse effizient zu synchronisieren – lokal oder über ein Netzwerk. Er überträgt nur geänderte Teile von Dateien, was ihn besonders schnell und bandbreitenschonend macht. rsync ist ideal für Backups, Spiegelungen und regelmäßige Synchronisationen zwischen Verzeichnissen oder Rechnern.

Syntax:

rsync [Optionen] Quelle Ziel

Verwendung:

Für effiziente Backups, Netzwerkübertragungen und automatisierte Synchronisationen.

Vorteile:

  • Überträgt nur geänderte Dateien → sehr schnell bei Wiederholungen
  • Netzwerkfähig (via SSH)
  • Fortschrittsanzeige, Testlauf-Modus (-n)
  • Ideal für Skripte und Automatisierung

Nachteile:

  • Etwas komplexer in der Handhabung
  • Irrtümlich gesetzte Optionen (z. B. --delete) können Daten löschen
  • Nicht alle macOS-spezifischen Metadaten werden immer exakt kopiert

5.3.1 Beispiele

Einen Ordner lokal synchronisieren:

rsync -av ~/Projekte/MeinApp/ ~/Backup/MeinApp/

→ Kopiert alle Dateien und Unterordner, behält Berechtigungen und Zeiten bei, synchronisiert nur geänderte Dateien.

Dateien auf einen anderen Rechner übertragen:

rsync -avz ~/Projekte/MeinApp/ user@server:/Users/user/Backup/MeinApp/

→ Überträgt den Ordner über SSH auf einen entfernten Rechner. Die Option -z komprimiert die Daten während der Übertragung.

Nur geänderte Dateien aktualisieren:

rsync -avu ~/Projekte/MeinApp/ ~/Backup/MeinApp/

→ Die Option -u sorgt dafür, dass nur neuere Dateien kopiert werden.

Dateien löschen, die im Ziel nicht mehr existieren:

rsync -av --delete ~/Projekte/MeinApp/ ~/Backup/MeinApp/

→ Hält das Zielverzeichnis exakt synchron mit der Quelle (Achtung: löscht zusätzliche Dateien im Ziel!).

5.3.2 Häufige Optionen

OptionBeschreibung
-n“Testlauf” – zeigt, was passieren würde, ohne Änderungen vorzunehmen
-aArchivmodus: kopiert rekursiv und bewahrt Berechtigungen, Zeiten und Symlinks
-vVerbose: zeigt detaillierte Fortschrittsinformationen
-zKomprimiert Daten während der Übertragung
-uÜberspringt Dateien, die im Ziel neuer sind
--deleteLöscht Dateien im Ziel, die in der Quelle nicht mehr existieren
--progressZeigt den Fortschritt jeder Dateiübertragung
-e sshErzwingt die Verwendung von SSH (meist automatisch aktiv)

5.3.3 Typische Anwendungsfälle

  • Erstellung und Aktualisierung von Backups´
  • Synchronisation zwischen zwei Festplatten oder Rechnern
  • Spiegelung von Verzeichnisstrukturen auf Servern
  • Automatisierte Sicherungsskripte (z. B. via cron)
  • Übertragung großer Datenmengen mit minimaler Redundanz

5.4 Vergleich: cp, ditto und rsync

Es gibt mehrere Befehle, um Dateien und Ordner zu kopieren oder zu sichern. Die drei wichtigsten sind cp, ditto und rsync. Obwohl sie ähnliche Aufgaben erfüllen, unterscheiden sie sich deutlich in Funktionsumfang, Zuverlässigkeit und Einsatzgebiet.

Merkmalcpdittorsync
Kopiert Verzeichnisse rekursiv✅ (-R)
Bewahrt Metadaten / ACLs⚠️ Teilweise✅ Vollständig⚠️ Teilweise
Versteckte Dateien (.git, .DS_Store)❌ Nicht immer
Nur geänderte Dateien kopieren
Fortschrittsanzeige⚠️ (mit -V)✅ (--progress)
Zusammenführen statt Überschreiben
Erstellung von Archiven (ZIP etc.)✅ (-c -k)
Netzwerkfähig✅ (SSH)
Skript-/Backup-tauglich⚠️ Einfach✅ Lokal✅ Sehr gut
Komplexität⭐ Einfach⭐⭐ Mittel⭐⭐⭐ Anspruchsvoll
  • cp: Für einfache, schnelle Kopien – ideal bei Einzeldaten.
  • ditto: Für vollständige, macOS-gerechte Kopien und Archive.
  • rsync: Für effiziente, wiederholbare Backups und Synchronisationen – auch über Netzwerke.

5.5 hdiutil – Disk Images erstellen und verwalten

hdiutil ist das mächtige Kommandozeilen-Tool für alle Disk-Image-Operationen unter macOS.

Image erstellen:

# Leeres DMG (100 MB, HFS+)
hdiutil create -size 100m -fs HFS+ -volname "MeinVolume" MeinImage.dmg

# APFS-Image
hdiutil create -size 100m -fs APFS -volname "MeinVolume" MeinImage.dmg

# Aus Ordner erstellen
hdiutil create -srcfolder ~/MeinOrdner -volname "Backup" Backup.dmg

# Mit Komprimierung
hdiutil create -srcfolder ~/MeinOrdner -format UDZO -volname "Backup" Backup.dmg

Image-Formate:

FormatCodeBeschreibung
Read/writeUDRWVeränderbar
CompressedUDZOzlib-komprimiert, read-only
LZMA compressedULMOStark komprimiert
SparseUDSPWachsend, veränderbar
Sparse bundleUDSBBand-basiert, wachsend
DVD/CD MasterUDTOFür Brennen

Image mounten:

# Standard-Mount (im Finder sichtbar)
hdiutil attach MeinImage.dmg

# Mount ohne Finder-Fenster
hdiutil attach MeinImage.dmg -nobrowse

# Mount an bestimmtem Punkt
hdiutil attach MeinImage.dmg -mountpoint /Volumes/MeinMount

# Read-only mounten
hdiutil attach MeinImage.dmg -readonly

# Ohne Verifizierung (schneller)
hdiutil attach MeinImage.dmg -noverify

Image aushängen:

# Nach Volume-Name
hdiutil detach /Volumes/MeinVolume

# Erzwingen
hdiutil detach /Volumes/MeinVolume -force

# Alle Images aushängen
hdiutil detach -all

Image konvertieren:

# Zu komprimiertem Read-only
hdiutil convert original.dmg -format UDZO -o komprimiert.dmg

# Zu read/write
hdiutil convert readonly.dmg -format UDRW -o readwrite.dmg

# Zu Sparse Bundle
hdiutil convert original.dmg -format UDSB -o sparse.sparsebundle

Image-Größe ändern:

# Größe erweitern (nur sparse/read-write)
hdiutil resize -size 200m MeinImage.dmg

# Auf minimale Größe schrumpfen
hdiutil resize -size min MeinImage.dmg

# Um Betrag erweitern
hdiutil resize -growonly -size 100m MeinImage.dmg

Image-Informationen:

# Image-Info anzeigen
hdiutil imageinfo MeinImage.dmg

# Nur Format
hdiutil imageinfo -format MeinImage.dmg

# Prüfsumme verifizieren
hdiutil verify MeinImage.dmg

5.6 Sparse Images und Sparse Bundles

Sparse Images wachsen dynamisch und belegen nur so viel Platz wie der tatsächliche Inhalt.

Sparse Image erstellen:

# Sparse Image (max 50 GB, wächst bei Bedarf)
hdiutil create -size 50g -type SPARSE -fs APFS -volname "Daten" Daten.sparseimage

# Sparse Bundle (bessere Performance bei Time Machine/Netzwerk)
hdiutil create -size 50g -type SPARSEBUNDLE -fs APFS -volname "Daten" Daten.sparsebundle

Unterschied Sparse Image vs. Sparse Bundle:

MerkmalSparse ImageSparse Bundle
DateistrukturEine DateiOrdner mit Bändern
Backup-freundlich❌ Ganze Datei✅ Nur geänderte Bänder
Time MachineNicht optimalEmpfohlen
NetzwerkLangsamSchneller
KompaktierenMöglichMöglich

Sparse Bundle Struktur:

ls Daten.sparsebundle/
# Info.plist
# bands/
#   0
#   1
#   2
#   ...
# token

Größe kompaktieren (ungenutzten Platz freigeben):

# Erst aushängen
hdiutil detach /Volumes/Daten

# Kompaktieren
hdiutil compact Daten.sparsebundle

# Oder für Sparse Image
hdiutil compact Daten.sparseimage

Bandgröße für Sparse Bundle festlegen:

# 8 MB Bänder (Standard)
hdiutil create -size 50g -type SPARSEBUNDLE -fs APFS \
    -imagekey sparse-band-size=16384 \
    -volname "Daten" Daten.sparsebundle

# sparse-band-size ist in 512-Byte-Sektoren
# 16384 * 512 = 8 MB
# 131072 * 512 = 64 MB

5.7 Verschlüsselte Disk Images

Disk Images können mit AES-128 oder AES-256 verschlüsselt werden – ideal für sensible Daten.

Verschlüsseltes Image erstellen:

# AES-256 (empfohlen)
hdiutil create -size 100m -fs APFS -volname "Geheim" \
    -encryption AES-256 -stdinpass Geheim.dmg
# Passwort eingeben...

# AES-128 (schneller)
hdiutil create -size 100m -fs APFS -volname "Geheim" \
    -encryption AES-128 Geheim.dmg

# Aus Ordner mit Verschlüsselung
hdiutil create -srcfolder ~/Vertraulich \
    -encryption AES-256 -format UDZO \
    -volname "Vertraulich" Vertraulich.dmg

Verschlüsseltes Sparse Bundle (empfohlen für wachsende Daten):

hdiutil create -size 10g -type SPARSEBUNDLE -fs APFS \
    -encryption AES-256 -volname "Tresor" Tresor.sparsebundle

Verschlüsseltes Image mounten:

# Passwort-Abfrage
hdiutil attach Geheim.dmg

# Passwort in Keychain speichern (beim ersten Mount)
# → Option im Dialog wählen

# Passwort per stdin
echo -n "geheim123" | hdiutil attach Geheim.dmg -stdinpass

Passwort ändern:

hdiutil chpass Geheim.dmg
# Altes Passwort eingeben
# Neues Passwort eingeben

Bestehendes Image verschlüsseln:

# Konvertieren mit Verschlüsselung
hdiutil convert Unverschluesselt.dmg \
    -format UDZO -encryption AES-256 \
    -o Verschluesselt.dmg

Sicherheits-Best-Practices:

  • AES-256 für sensitive Daten verwenden
  • Starkes Passwort wählen (Passphrase)
  • Passwort nicht im Schlüsselbund speichern für höchste Sicherheit
  • Image nach Gebrauch aushängen
  • Bei Sparse Bundles: Nach Löschen von Dateien kompaktieren

5.8 DMG-Dateien per Terminal

DMG aus Ordner erstellen (App-Verteilung):

# Einfaches DMG
hdiutil create -srcfolder MeinApp.app \
    -volname "MeinApp" \
    -format UDZO \
    MeinApp.dmg

# Mit Hintergrundbild und Icon-Positionen
# (Erfordert erst ein Read/Write Image)
hdiutil create -srcfolder MeinApp.app \
    -volname "MeinApp" \
    -format UDRW \
    -fs HFS+ \
    temp.dmg

# Mounten und anpassen
hdiutil attach temp.dmg

# Finder-Einstellungen setzen (AppleScript oder manuell)
# ...

# Zu komprimiertem DMG konvertieren
hdiutil convert temp.dmg -format UDZO -o MeinApp.dmg
rm temp.dmg

Internet-Enabled DMG (automatisches Entpacken):

hdiutil internet-enable -yes MeinApp.dmg

DMG verifizieren:

# Prüfsumme verifizieren
hdiutil verify MeinApp.dmg

# Inhalt auflisten ohne Mounten
hdiutil imageinfo MeinApp.dmg

DMG in ISO konvertieren:

hdiutil convert original.dmg -format UDTO -o converted.cdr
mv converted.cdr converted.iso

ISO/CDR erstellen:

# Aus Ordner
hdiutil makehybrid -iso -joliet -o output.iso source_folder/

# CD/DVD-Master für Brennen
hdiutil create -srcfolder Daten -format UDTO -o Master.cdr

Bootfähiges USB-Medium erstellen:

# macOS-Installer auf USB
sudo /Applications/Install\ macOS\ Sonoma.app/Contents/Resources/createinstallmedia \
    --volume /Volumes/USB

# Alternativ mit dd (für Linux ISOs etc.)
diskutil unmountDisk /dev/disk2
sudo dd if=linux.iso of=/dev/rdisk2 bs=1m
diskutil eject /dev/disk2

Praktische Aliase:

# ~/.zshrc

# DMG schnell erstellen
dmg-create() {
    local src="$1"
    local name="${2:-${src:t}}"
    hdiutil create -srcfolder "$src" -volname "$name" -format UDZO "${name}.dmg"
}

# Verschlüsseltes Sparse Bundle erstellen
vault-create() {
    local name="$1"
    local size="${2:-10g}"
    hdiutil create -size "$size" -type SPARSEBUNDLE -fs APFS \
        -encryption AES-256 -volname "$name" "${name}.sparsebundle"
}

# DMG schnell mounten
alias dmg-mount='hdiutil attach'
alias dmg-unmount='hdiutil detach'

Cheatsheet hdiutil:

# Erstellen
hdiutil create -size 100m -fs APFS -volname NAME out.dmg
hdiutil create -srcfolder ORDNER -format UDZO out.dmg
hdiutil create -size 10g -type SPARSEBUNDLE -encryption AES-256 out.sparsebundle

# Mounten
hdiutil attach image.dmg
hdiutil attach image.dmg -mountpoint /Volumes/MOUNT
hdiutil attach image.dmg -readonly

# Aushängen
hdiutil detach /Volumes/NAME

# Konvertieren
hdiutil convert in.dmg -format UDZO -o out.dmg
hdiutil convert in.dmg -format UDRW -o out.dmg

# Größe ändern
hdiutil resize -size 200m image.sparseimage
hdiutil compact image.sparsebundle

# Info
hdiutil imageinfo image.dmg
hdiutil verify image.dmg