rsync nur eine bestimmte Untergruppe von Verzeichnissen

6057
Martin Scharrer

Ich muss rsync verwenden, um mehrere Verzeichnisse von einem rsync-Server zu synchronisieren. Das gesamte rsync-Modul ist ziemlich groß und ich vermeide es, andere nicht benötigte Teile zu bewältigen.

Ich habe die gewünschten Verzeichnisse als Textdatei, habe aber Probleme beim Erstellen einer richtigen Filterregeldatei. Meine Anforderungen lauten wie folgt:

  • Fügen Sie nur Verzeichnisse in meine Liste ein, die alle Dateien und Unterverzeichnisse enthalten.
  • Dateien in den enthaltenen Verzeichnissen sollten gelöscht werden, wenn sie auf dem Server gelöscht werden.
  • Es sollten jedoch nicht alle .hgVerzeichnisse (Mercurial-Repository) auf meiner Site, aber nicht auf dem Server sowie alle darin enthaltenen Dateien und Unterverzeichnisse gelöscht werden.
  • Ausgeschlossene Verzeichnisse sollten nicht gelöscht werden.

Bisher habe ich eine Filterdatei erstellt, die so aussieht

include sub/dir/I/want/*** include other/sub/dir/I/want/*** ... protect .hg/*** exclude ** 

Aber das schließt scheinbar alles aus. Ohne die excludeZeile sind auch alle anderen Dateien enthalten.

4

2 Antworten auf die Frage

2
Martin Scharrer

Ich habe das Problem gefunden. Meine Probleme wurden übrigens durch die rsyncVerarbeitung der Dateinamen verursacht. Der absolute Pfad (dh relativ zum Übertragungsstammverzeichnis) funktioniert nicht direkt, da die übergeordneten Verzeichnisse ebenfalls enthalten sein müssen. Andernfalls ist die gesamte Verzeichnisstruktur bereits ausgeschlossen und die gewünschte Datei oder das Unterverzeichnis wird nie verarbeitet. Das Handbuch sagt zwar (irgendwo), aber es ist sehr kontraintuitiv.

Um nur bestimmte Unterverzeichnisse einzuschließen, müssen alle übergeordneten Verzeichnisse enthalten sein, und alle anderen Unterverzeichnisse müssen dann wieder ausgeschlossen werden:

include sub/ include sub/dir/ include sub/dir/I/ include sub/dir/I/want/*** exclude sub/* exclude sub/dir/* exclude sub/dir/I/*  include other/ include other/sub/ include other/sub/dir/ include other/sub/dir/I/ include other/sub/dir/I/want/*** exclude other/* exclude other/sub/* exclude other/sub/dir/* exclude other/sub/dir/I/*  ...  protect .hg* exclude /* 

Die vorletzte Zeile schützt alle .hg*Verzeichnisse und Dateien wie .hg/und .hgtags. Die Zeile schließt alle anderen Verzeichnisse im Übertragungsstammverzeichnis aus.

Ich habe ein Perl-Skript geschrieben, um die obige Filterdatei aus der Liste der gewünschten Unterverzeichnisse zu erstellen. Es ist unter http://www.perlmonks.org/?node_id=928357 verfügbar .

0
grawity

Führen Sie rsync zweimal aus.

rsync hostname::sub/dir/I/want/ ./sub/dir/I/want/ rsync hostname::other/sub/dir/I/want/ ./other/sub/dir/I/want/ 
Ich habe über 2000 Unterverzeichnisse, die ich möchte, daher ist dies keine Option. Martin Scharrer vor 13 Jahren 1