CLI AI

Dateien nach Muster kopieren, Ordnerstruktur erhalten

2026-07-06

Kurze Antwort: cp --parents und rsync kopieren dieselben Dateien, bauen aber unterschiedliche Zielbäume auf. find src -name '*.txt' -exec cp --parents {} dst/ \; legt sie unter dst/src/a/b/file ab; die rsync-Variante mit include/exclude legt dieselben Dateien unter dst/a/b/file ab — ohne das Segment src. Die falsche Methode gewählt, und man hat eine zusätzliche Verschachtelungsebene, vor der niemand gewarnt hat.

1. Wie kopiere ich Dateien nach einem Muster und behalte dabei die Ordnerstruktur?

clai
$ clai kopiere alle txt Dateien von src nach dst und behalte die Ordnerstruktur→ find src -name '*.txt' -exec cp --parents {} dst/ \;

--parents baut im Ziel den vollständigen Pfad zur Datei nach. Das Ergebnis ist dst/src/a/b/file: src selbst landet innerhalb des Ziels, weil es Teil des Pfads ist, den Sie find übergeben haben. Das ist die Überraschung, um die es in diesem Artikel geht.

2. Warum baut rsync für dieselbe Aufgabe einen anderen Zielbaum?

clai
$ clai kopiere nur die txt Dateien von src nach dst2 und behalte die Verschachtelung→ rsync -a --include='*/' --include='*.txt' --exclude='*' src/ dst2/

Dieselben Dateien, anderes Ergebnis: dst2/a/b/file, ohne die Ebene src. Der abschließende Schrägstrich bei src/ bedeutet "der Inhalt des Verzeichnisses", nicht das Verzeichnis selbst. Auch die Reihenfolge der Regeln zählt: zuerst mit --include='*/' das Durchqueren aller Verzeichnisse erlauben, dann die gewünschten Dateien, und erst danach den Rest ausschließen. Verschieben Sie --exclude='*' nach vorne, wird nichts kopiert.

3. Wie prüfe ich vorab, was rsync kopieren würde?

clai
$ clai zeig mir, was kopiert würde, aber kopiere nichts→ rsync -avn --include='*/' --include='*.txt' --exclude='*' src/ dst2/

-n ist ein Trockenlauf. Bei nicht trivialen include/exclude-Regeln bedeutet das Weglassen von -n, das Ergebnis erst hinterher zu erfahren statt vorher. Führen Sie -n immer zuerst aus.

4. Wie kopiere ich Dateien mit derselben Struktur auf einen entfernten Server?

clai
$ clai bringe alle txt Dateien mit erhaltener Struktur auf einen entfernten Server→ find src -name '*.txt' -print0 | tar --null -cf - -T - | ssh user@host 'tar -xf - -C /dest'

tar verpackt die Dateien in einen Datenstrom und packt sie auf der anderen Seite unverändert wieder aus. -print0 und --null schützen vor Leerzeichen in Dateinamen. Ein Durchlauf über das Netzwerk statt tausend einzelner Kopien.

5. Wie kopiere ich, ohne neuere Dateien im Ziel zu überschreiben?

clai
$ clai kopiere die Dateien, aber lass die im Ziel neueren in Ruhe→ rsync -au src/ dst/

-u überspringt jede Datei, deren Kopie im Ziel ein neueres Änderungsdatum hat. Nötig, wenn die Synchronisation in beide Richtungen läuft oder das Ziel bereits Änderungen enthält, die nicht überschrieben werden sollen.

6. Wie erzeuge ich nur den Verzeichnisbaum, ohne die Dateien?

clai
$ clai erstelle in dst denselben Ordnerbaum wie in src, ohne die Dateien→ rsync -a --include='*/' --exclude='*' src/ dst/

Dieselben Regeln, minus der Zeile, die Dateien durchlässt. Nützlich, um einen Baum für eine Ausgabe vorzubereiten — etwa vor einer Stapel-Bildkonvertierung.

Stolperfallen

  • Der abschließende Schrägstrich bei der Quelle ändert bei rsync alles. src/ kopiert den Inhalt, src kopiert das Verzeichnis selbst in das Ziel. Einer der häufigsten Fehler, und er ist lautlos.
  • Die Reihenfolge von include und exclude ist die Regelreihenfolge. rsync wendet die erste passende Regel an. --exclude='*' steht immer zuletzt, sonst frisst es alles andere, bevor Ihre include-Regeln zum Zug kommen.
  • cp --parents gibt es nur unter GNU. Auf macOS fehlt es — dort die rsync- oder tar-Variante verwenden.

Verwandte Fragen

Wie kopiere ich mehrere Endungen auf einmal? --include wiederholen: --include='*.jpg' --include='*.png' vor --exclude='*'.

Warum hat rsync nichts kopiert? Fast immer fehlt --include='*/': ohne es steigt rsync nie in Unterverzeichnisse ab und erreicht die Dateien gar nicht erst.

cp oder rsync? rsync, sobald die Regeln über eine Endung hinausgehen, ein Trockenlauf gewünscht ist, oder die Kopie unterbrochen werden könnte. cp für schnelle, einfache Einzelfälle.

Siehe auch

Beschreiben Sie das Kopieren, lesen Sie den Befehl, den CliAI schreibt, und führen Sie ihn aus. In einer Zeile installieren.