
Ich versuche, den rsync-Befehl vorzubereiten, der: 1. alle Dateien im Verzeichnis sichert, aber keine verschachtelten Dateien, 2. bestimmte Verzeichnisse sichert, 3. Dateien im Zielverzeichnis löscht, wenn sie im Quellverzeichnis gelöscht werden
rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/
Dies kopiert jedoch nur Dateien und keine Ordner und löscht auch nichts. Können Sie mir helfen, den Befehl zu verbessern?
Antwort1
Genau genommen können die folgenden Ziele als widersprüchlich interpretiert werden.
- Sichern Sie alle Dateien im Verzeichnisaber nicht verschachtelte Dateiendh --exclude='*/'
- Sichern Sie bestimmte Verzeichnisse - schließen Sie also einige verschachtelte Dateien ein
Nachfolgend finden Sie eine Erklärung, warum Ihre Argumente nicht Ihren Vorstellungen entsprachen. Weiter unten finden Sie eine geeignete Alternative, die Ihren Zweck erfüllen könnte (sie erfüllt Nr. 1, Nr. 3 und eine Version von Nr. 2).
Warum Ihr Befehl nicht funktioniert hat:
So wie rsync Ihre Befehlszeilenargumente verarbeitet, sind die folgenden Argumente gleichbedeutend mit der Aussage --exclude='*/'
--exclude='/' --include='gewünschter_Unterordner/'
d. h. Ihr Befehl hat alle verschachtelten Dateien und damit auch die Dateien in den gewünschten Unterordnern ausgeschlossen.
Dieses Problem betrifft Ihre zweite Beobachtung, nämlich dass Dateien im Ziel, die in der Quelle gelöscht werden, nicht gelöscht werden. Tatsächlich funktioniert Ihr Befehl beim Löschen solcher Dateien auf der obersten Ebene einwandfrei. Dateien eine Ebene darunter werden jedoch nicht gelöscht, da sie bereits ausgeschlossen sind. Es ist hilfreich, sich daran zu erinnern, dass sich --delete auf --delete-during bezieht, nicht auf --delete-before.
Lösungen, die Nr. 1, Nr. 3 und Version von Nr. 2 erfüllen: Die folgende Lösung könnte Ihren Anforderungen entsprechen
rsync -avz --delete --include='includes/*' --include='js/*' --include='css/*' --exclude='*/*' /home/gameboy/abc/ /home/gameboy/PartialMirror/abc/
Es erfüllt Folgendes: 1. Sichert alle Dateien und Verzeichnisse in Tiefe 1, jedoch keine verschachtelten Dateien. 2. Sichert die gewünschten Ordner. 3. Löscht Dateien im Ziel, die nicht in der Quelle vorhanden sind.
Eine andere, etwas umständlichere Wahl ist wie folgt
rsync -vlptgoDd --delete src/ dest/
Dies erfüllt Nr. 1 und Nr. 3, vermeidet aber alle verschachtelten Dateien (denken Sie daran, dass Ordner in *nix auch Dateien sind). Ich habe die Option -r vermieden, damit sie nicht rekursiv ist. Löschen funktioniert und Ordner in Tiefe 1 werden kopiert. Zusätzlich zum Beibehalten von Zeitstempeln (-t) habe ich die anderen typischen Optionen zum Kopieren von Archiven aufgenommen.
Eine standardmäßigere Methode, um in verschiedenen Ordnern unterschiedliche rsync-Verhaltensweisen zu erzielen, besteht darin, Filterregeln verzeichnisweise in der Hierarchie zu verteilen. Das heißt, Sie erstellen .rsync-filter-Dateien, die für jeden Ordner spezifisch sind, der ein einzigartiges Verhalten erfordert. Zum Beispiel
rsync -avF src/ dest/