Gibt es eine Möglichkeit, per rsync nur Dateien eines bestimmten Benutzers zu synchronisieren? Ich habe einen Ordner, der Dateien mehrerer Benutzer enthält, möchte aber nur die Dateien eines bestimmten Benutzers sichern.
Ich habe mir die Manpages für rsync angesehen, aber es scheint kein solches Flag zu geben.
Irgendwelche Ideen?
Antwort1
Nein, es gibt keine Möglichkeit, die Dateien eines bestimmten Benutzers direkt über die rsync-Befehlszeile herauszufiltern.
Es ist jedoch sehr einfach, eine Liste dieser Dateien zu erstellen, beispielsweise mit einem Befehl wie
find /src/directory -type f -exec ls -lh {} \; | awk '{if ($3 == "your_name") for (i=1; i<=NF-8; i++) $i = $(i+8); NF-=8; print}'
find
findet alle Dateien im Verzeichnisbaum unterhalb des Verzeichnisses /src/ und druckt eine lange Liste aus, die den Besitzer enthält. Diese Listen werden dann an übergeben awk
, das diejenigen auswählt, die Ihnen gehören („Ihr_Name“) und dann nur für diese den vollständigen Pfad ausgibt. Die seltsame Konstruktion, die mit beginnt, for
ist auf die Tatsache zurückzuführen, dass einige der Dateinamen ein Leerzeichen enthalten können. Daher druckt diese Konstruktion alle Token ( i.e.
, alle durch Leerzeichen getrennten Zeichenfolgen) ab der 9. Spalte aus (Dateinamen können eine beliebige Anzahl von Leerzeichen enthalten). Außerdem stellt diese Konstruktion sicher, dass dies in einer einzigen Zeile bleibt.
Sie können diese Ausgabe in eine Datei umleiten und rsync dann nur auf die in dieser Datei aufgelisteten Dateien anwenden.
Antwort2
Die Antwort von MariusMatutiae hat bei mir nicht funktioniert: Ich habe dort -rw-r--r--
nur Massen von Zeilen erhalten.
Also habe ich diese Antwort entwickelt:
- Der
find
Befehl hat die Option-user
(und-group
), die viel einfacher zu verwenden ist. Wir benötigen relative Pfad-/Dateinamen:
a)find
Option:-printf '%P\n'
oder
b) Pipe Throughsed -e "s#/path##"
- rsync bietet die Möglichkeit, aus Dateien zu synchronisieren: . Sie benötigen diese Datei lokal. Sie müssen also die Dateien per Push an rsync senden, oder der Server, der sie abruft, muss sie zuerst von der Remote-Seite abrufen, auf der die Liste zuvor generiert wurde.
--files-from=FILE
=> Für mein Beispiel funktioniert das:
1a) find /usr/share/piwik/ -user www-data -printf '%P\n' > /tmp/find-piwik-rsync.list
oder
1b)find /usr/share/piwik/ -user www-data | sed -e "s#/usr/share/piwik/##" > /tmp/find-piwik-rsync.list
2)rsync -a --files-from=/tmp/find-piwik-rsync.list /usr/share/piwik/ remote:/usr/share/piwik
-n
Sie sollten es zuerst mit / testen --dry-run
.