
Ich verwende rsync, um einen großen freigegebenen Dokumentordner mit meinem Laptop synchron zu halten. Genauer gesagt führe ich eine rsync-Synchronisierung VON meinem Laptop ZUM freigegebenen Repository durch. Dabei möchte ich nur die Dateien rsyncen, die von meinem Benutzer erstellt/geändert wurden. Da es sich um ein freigegebenes Repository handelt, haben andere Benutzer möglicherweise andere Verzeichnisse oder Dateien erstellt.
Ich habe die verschiedenen rsync-Optionen durchgesehen, aber nicht gefunden, wonach ich suche. Ich kann --exclude
oder --delete-excluded
muss nur Muster angeben, die mit dem Dateinamen übereinstimmen, keine anderen Metadaten (oder kann ich das?).
Eine alternative, aber etwas umständliche Lösung könnte darin bestehen, ein Remote-Skript wie find -not -perm $USER > excluded_files
und rsync zu starten und diese auszuschließen, aber das möchte ich lieber nicht tun.
Irgendwelche Ideen?
Update: Zur Klarstellung: Die Daten auf meinem Laptop sind nur ein Teil der Daten auf dem Server. Hier ist ein Beispiel
- mein Laptop enthält
dir_1
unddir_2
- Ich synchronisiere sie mit dem Server. Jetzt enthält der Server zwei Verzeichnisse
- Ein anderer Benutzer meldet sich am Server an und erstellt ein neues Verzeichnis
dir_3
- Ich habe meine Dateien durcheinander gebracht, werde jetzt erneut rsync verwenden, muss aber --delete verwenden
- Ich möchte NUR die Dateien löschen, die ich zuerst erstellt habe, also die auf
dir_1
unddir_2
,nichtdir_3
Antwort1
Ich gehe davon aus, dass es keine Option ist, eine Kopie aller Dateien auf Ihrem Laptop aufzubewahren. Sonst wäre es viel einfacher.
Das richtige Tool hierfür ist ein Versionskontrolltool. Mir ist jedoch klar, dass es keine realistische Idee ist, alle Benutzer dazu zu bringen, Versionskontrolltools zu verwenden, es sei denn, sie verfügen über ein Mindestmaß an technischer Kompetenz. Und selbst dann müssten Sie sorgfältig auswählen, was Sie auf Ihrem Laptop ausleihen.
Dukönnte immer noch die Versionskontrolle verwenden. Checken Sie auf dem gemeinsam genutzten Rechner alle Ihre Dateien ein und lassen Sie die Dateien anderer Leute in Ruhe. Führen Sie auf Ihrem Laptop einen separaten Checkout durch. Commit und Checkout, wann immer Sie den Rechner wechseln. Je mehr ich darüber nachdenke, desto besser gefällt mir diese Option: Sie erfordert weder Codierung noch fragile Skripte.
Sie führen eine bidirektionale Synchronisierung durch. Rsync ist dafür nicht gut geeignet: Wenn Sie vergessen, es auszuführen, oder es versehentlich in die falsche Richtung ausführen, geht Ihre Arbeit wahrscheinlich ohne Vorwarnung verloren.Einklangist ein gutes Tool für die bidirektionale Synchronisierung: Es synchronisiert immer bidirektional und meldet, wenn sich eine Datei auf beiden Seiten geändert hat. Es ist Open Source und sowohl in Unix- als auch in Windows-Plattformen gut integriert.
Leider bietet Unison keine Option zum Ignorieren von Dateien nach Eigentümer, ebenso wenig wie rsync. Sie können eine Ignorierliste mit erstellen find -user
, aber das wird unübersichtlich und es kommt zu einem Race Condition, wenn jemand anderes zwischen dem Lauf von find
und dem Lauf von unison
oder Dateien hinzufügt oder löscht rsync
.
Sie könnten rsync oder unison patchen, um die Option hinzuzufügen, Dateien basierend auf ihren Metadaten zu ignorieren. Ich habe mir gerade kurz die Quelle angesehen und in beiden Fällen ist der Ausschlusscode stark an Zeichenfolgen gebunden, nicht an Verzeichniseinträge. Es sieht machbar aus, ist aber kein trivialer Patch.
Sie könnten eine Ansicht des Dateisystems erstellen, die nur Ihre Dateien enthält. Ich habe keine vollständige, nahtlose Lösung, aber hier sind ein paar Ideen für den Anfang.
Wenn die gemeinsam genutzte Maschine Hardlinks unterstützt (alle Unix-Systeme tun dies, und Windows tut dies seit NT4, solange Sie NTFS verwenden), ist es recht einfach, eine Kopie des Repository zu erstellen, die nur Hardlinks Ihrer Dateien enthält:
cd /shared/repository find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" && ln "$0" "/my/view/$0"' {} \;
oder mit zsh:
autoload zmv zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
Man müsste aufpassen, dass man beim Editieren oder Synchronisieren keine Hardlinks zerstört. Ich weiß nicht, wie rsync und unison das hinbekommen würden. Nach der ersten Erstellung soll eine Datei im Shared Repository, die einem gehört und einen Link-Count von 1 hat, gelöscht werden, und eine Datei in der eigenen Ansicht mit einem Link-Count von 1 soll im Shared Repository verlinkt werden. Das ist alles ziemlich umständlich, und ich würde mich über Verbesserungsvorschläge freuen.
Wenn der gemeinsam genutzte Computer dies unterstützt,SICHERUNG, können Sie damit eine Live-Ansicht des gemeinsamen Repositorys erstellen, das nur Ihre Dateien enthält. Ich kenne kein vorhandenes FUSE-Dateisystem, das dies kann, aberbindfskommt nahe heran (ich habe mir den Code nicht angesehen, um den Schwierigkeitsgrad der Codierung einzuschätzen).
Sie können beim Ausführen von rsync oder unison
LD_PRELOAD
„to override“readdir
(oder ein Windows-Äquivalent) verwenden, sodass nur die Dateien zurückgegeben werden, die Ihnen gehören.