rsync - Alle Verzeichnisse mit Ausnahme einiger weniger ausschließen

7

Es scheint eine Menge SF- und SO-Fragen zu geben, aber keine scheint meinen Anforderungen zu entsprechen.

source_dir/
  some_dir/
  another_dir/
  some_file.php
  some_other_file.txt
  include_this_dir/
  include_that_dir/
  yet_another_dir/

Ich möchte also zwei dieser Verzeichnisse synchronisieren und den Rest ausschließen. Es ist wichtig, dass wir alle außer diesen beiden Verzeichnissen ausschließen, da möglicherweise andere Dateien zu einem späteren Zeitpunkt zum Quellverzeichnis hinzugefügt werden und ausgeschlossen werden müssten, ohne explizit aufgeführt zu werden.

Ich habe es versucht:

rsync -av --dry-run --delete --exclude="source_dir/*" (or just "*") --include-from="include.txt" source_dir dest_dir

Und meine include.txt hatte

  include_this_dir/
  include_that_dir/

und ich habe auch versucht hinzuzufügen

  source_dir/

Keine Freude. Es wird überhaupt nichts aufgenommen.

Tom Auger
quelle
1
Sie können versuchen, die Option include vor die Option exclude zu setzen. Ich bin mir nicht sicher, aber rsync hört möglicherweise nach dem ersten Spiel auf zu prüfen.
Digitaladdictions
Ich denke, ich habe das schon einmal versucht, aber es ist einen weiteren Versuch wert
Tom Auger

Antworten:

14

Ein einfacher Filter sollte den Trick machen. So bauen Sie auf der vorherigen Antwort mit einem geeigneten Beispiel auf: Geben Sie explizit die übergeordneten Elemente sowie alle (**) Unterordner und Dateien an. Dann alles andere ausschließen. Hier ist filter.txt:

+ /include_this_dir/
+ /include_this_dir/**
+ /include_that_dir/
+ /include_that_dir/**
- /**

Mit der Kommandozeile:

rsync -av --dry-run --filter="merge filter.txt" source_dir/ dest_dir/

Würde ergeben zu:

sending incremental file list
created directory dest_dir
./
include_that_dir/
include_that_dir/somefile.txt
include_that_dir/subdir/
include_this_dir/

sent 202 bytes  received 65 bytes  534.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
Darryl E. Clarke
quelle
3
Sie können es mit drei "*" weiter reduzieren + /include_this_dir/***, was bedeutet+ /include_this_dir/ + /include_this_dir/**
Drasill
2

Um aus dem rsyncmanuellen Abschnitt zu zitieren FILTER RULES:

[..] Das erste übereinstimmende Muster wird bearbeitet: Wenn es sich um ein Ausschlussmuster handelt, wird diese Datei übersprungen. Wenn es sich um ein Include-Muster handelt, wird dieser Dateiname nicht übersprungen. Wird kein passendes Muster gefunden, wird der Dateiname nicht übersprungen.

Daher ist es möglicherweise die beste Option, Ihre Filterregeln aus einer Datei zu lesen und entsprechend zu sortieren. Beispiel:

CW+ source_dir/include_this_dir/
CW+ source_dir/include_that_dir/
CW- source_dir/

Sie können die Filterregeldatei mit dem --filter=Parameter angeben .

M. Glatki
quelle
0

Neue Befehlszeichenfolge, die - eingeschlossene Verzeichnisse erstellt und deren Inhaltsverzeichnis und / oder Dateien kopiert, jedoch NUR 2 DIRS DEEP. Warum?

rsync -avid --progress ~/MyDocuments/'Inet Publishing'/ --recursive --include='LandisTwo (2019)' --include='LandisTwo (2020) {backup}' --include='*.*' --exclude='**/' e6420:/home/landis/Media/2TBackup/Backups/MyDocuments/"Inet\ Publishing"/ | tee -a ~/logs/Backup-InetPublishing_2020.txt
  • Ich habe festgestellt, dass die Verzeichnisse erstellt wurden, aber KEINE DATEIEN in sie kopiert wurden (keine Rekursion). Dateien im übergeordneten Element werden kopiert, aber keine Unterverzeichnisse - es wird daran gearbeitet.

Dies funktioniert für mich von der Workstation zum Server und sichert (rysnc) meine persönliche Site auf einem anderen Server zusätzlich zum gesamten Verzeichnis mit allen Sites, wenn das übergeordnete Element rysnc ist. / Inet \ Publishing (das 'n' in -avin ist 'Trockenlauf', entfernen.).

Das --exclude * / ist alle anderen Verzeichnisse in 'Inet Publishing /' und muss anscheinend After --include per man rsync process order sein (wenn vor --include, dann ist Everything --excluded und es werden keine weiteren Token verarbeitet , zumindest habe ich es so gelesen und in der Praxis Trockenläufe gemacht, wenn ich darauf gekommen bin.).

Dies ist eigentlich eine Zeile aus einem meiner Skripte, die ich mit cron ausführe. * offensichtlich kann der Zielhost eine IP sein, ich habe die Hosts in / etc / hosts definiert und habe SSH-Schlüsselpaare ,,, also benutze ich den Hostnamen.

rsync -avin --progress ~ / MyDocuments / 'Inet Publishing' / --include = 'LandisTwo (2019)' --include = 'LandisTwo (2020) {backup}' --exclude = '* /' e6420: / home / landis / Media / 2TBackup / Backups / MyDocuments / | tee -a ~ / logs / Backup-InetPublishing_2020.txt
Landis Reed
quelle