rsync: So schließen Sie das oberste Verzeichnis aus

14

Ich habe ein scheinbar einfaches Problem, aber bis jetzt habe ich keine Lösung gefunden: Ich möchte das oberste Verzeichnis von einem Rsync ausschließen, während alle seine Kinder synchronisiert werden. Das besondere Problem ist, dass ich keine Berechtigung zum Ändern der Zeiten des obersten Verzeichnisses habe, aber möchte, dass alle Kinder die Zeiten ordnungsgemäß synchronisieren.

Der von mir verwendete Befehl rsync lautet wie folgt:

rsync --exclude ./ -rlptDu ./ server.example.com:/usr/local/directory/

und server.example.com:/usr/local/directory/sieht so aus:

drwxrws---  5 root   staff 24576 Jul  9 15:00 .

(mein lokaler Benutzer ist Mitglied von staff)

Wenn ich rsync ausführe, wird folgende Fehlermeldung angezeigt:

rsync: failed to set times on "/usr/local/directory/.": Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]
make: *** [pub_to_mel_internal] Error 23

Dies ist die Version 3.0.9 auf dem lokalen Rechner und 3.0.7 auf dem entfernten Rechner, auf denen Debian ausgeführt wird.

Steve Pomeroy
quelle
Kennen Sie die Syntax in diesem Beispiel: wirespeed.xs4all.nl/mediawiki/index.php/… Hiermit können Sie bestimmte Dateien / Verzeichnisse aus einem ansonsten ausgeschlossenen Verzeichnis einschließen. Möglicherweise müssen Sie jedoch eine Ausschlussdatei verwenden.
Hippie
Ja. Das Problem ist, dass ich es anscheinend nicht überzeugen kann, das Toplevel-Verzeichnis (speziell) auszuschließen. Ich hatte in der Vergangenheit keine Probleme mit dem Mischen von Einschlüssen / Ausschlüssen, es scheint nur, als wäre die oberste Ebene ein Sonderfall.
Steve Pomeroy

Antworten:

8

Ich denke, die Filterregeln von rsync stimmen nicht mit dem Verzeichnis der obersten Ebene überein, daher ist es immer synchronisiert. Eine Problemumgehung besteht darin, alle Dateien in diesem Verzeichnis anstelle des Verzeichnisses selbst zu synchronisieren.

rsync -rlptDu -- * server.example.com:/usr/local/directory/

Fügen Sie .[!.]*danach hinzu, *wenn Sie Punktdateien im obersten Verzeichnis haben und ..?*wenn Sie Dateinamen haben, die mit zwei Punkten beginnen.

Gilles 'SO - hör auf böse zu sein'
quelle
2
Super, danke! Das funktioniert. Der einzige Nachteil dieser Technik ist, dass die Shell alle Dateien auswählen muss. Wenn Sie Unmengen von Dateien im Verzeichnis haben (was ich in meinem Fall nicht tue), kann es ersticken. Das könnte wahrscheinlich mit xargs behoben werden (allerdings nicht mit den --delete-Optionen).
Steve Pomeroy
Ein Problem bei der Verwendung von *war, dass --deletekeine Dateien gelöscht wurden, da diese nicht Teil der Suche waren.
thomasa88
@ thomasa88 Bitte sehen diese Antwort .
Kamil Maciorowski