Are rsync ignora timestamps fișier și suprascrie automat pe client dacă fișierul este diferit pe server? (Programare, Sincronizare, Rsync)

Chirael a intrebat.

Încerc să configurez două PC-uri pentru a sincroniza un arbore de dosare, astfel încât fiecare PC să aibă o copie a arborelui cu cele mai recente actualizări ale fiecărui fișier.

M-am gândit să configurez Mercurial, dar mi-am dat seama că nu-mi pasă cu adevărat de versiuni (mai ales că am puțin spațiu pe disc) și că rsync pare să facă mai mult din ceea ce vreau – doar să țină fișierele la zi, fără versiuni.

Cu toate acestea, pagina de la http://www.linuxjournal.com/content/synchronizing-your-life spune următoarele:

Cu rsync, orice fișier care există deja la destinație nu va fi transferat. Acest lucru accelerează considerabil timpul de transfer. Cu toate acestea, există încă problema de a avea modificări făcute de ambele părți. În mod implicit, programul rsync se uită doar dacă fișierele sunt diferite ca dimensiune și data și ora. Nu-i pasă care fișier este mai nou, dacă este diferit, acesta este suprascris.

Puteți trece indicatorul „–update” la rsync, ceea ce îl va determina să treacă peste fișierele de la destinație dacă acestea sunt mai noi decât cele de la sursă, dar numai dacă sunt de același tip de fișier. Acest lucru înseamnă că, de exemplu, dacă fișierul sursă este un fișier normal, iar cel de destinație este un link simbolic, fișierul de destinație va fi suprascris, indiferent de data și ora. Chiar și dacă trece peste ciudățeniile sale, steagul –update nu rezolvă problema, deoarece tot ceea ce face este să sară peste fișierele de la destinație dacă acestea sunt mai noi, nu trage aceste modificări în jos pe calculatorul sursă.

Este corect acest lucru?

Dacă da, cred că rsync este util doar pentru a face copii de rezervă de pe o mașină principală („sursă”) pe unul sau mai mulți sclavi care vor primi modificările de la mașina principală indiferent de data și ora de apariție. În timp ce problema pe care încerc să o rezolv cu adevărat este ca două mașini să fie „perechi” și să primească în mod egal doar cele mai recente fișiere actualizate de la cealaltă.

Sau credeți că va trebui să mușc glonțul și să folosesc git sau Mercurial, în ciuda spațiului suplimentar pe disc pentru urmărirea versiunilor?

(Da, știu despre Dropbox; am depășit cu mult limita de 2GB a contului gratuit și nu sunt interesat să cheltui 120-240$ pe an când nu am nevoie de stocare în cloud și ceva atât de simplu. trebuie să să fi fost făcut înainte cu instrumente gratuite & deschise).

PC-urile rulează amândouă XP, dar aveam de gând să folosesc rsync de la Cygwin și orice alte instrumente Unixy necesare pentru a face treaba.

4 răspunsuri
nyk
rsync av --update /loc1 /loc2

deci numai fișierele care sunt mai NOI vor fi sincronizate de la loc1 la loc2. logica dictează că orice fișier care este mai NOU pe loc2 va fi neatins. prin urmare, toate fișierele învechite de pe loc2 vor fi actualizate datorită lui loc1

rsync av --update /loc2 /loc1

Acum știm că toate fișierele mai noi din loc1 au fost copiate în loc2.Orice fișier mai vechi din loc1 (care avea fișiere mai noi în loc2) a rămas neschimbat.A doua comandă rsync va actualiza acum loc1 cu fișierele mai noi din loc2.

Et Voila! ambele locații sunt sincronizate în acest exemplu.

Martijn de Milliano

Dacă aveți probleme cu rsync și timestamp-urile, poate că trebuie să vă uitați la precizia cu care sunt stocate timestamp-urile pe diferitele sisteme de fișiere implicate în sincronizare.

Utilizați fstat pentru a detecta acest lucru: dacă sincronizați un fișier și originalul are un timestamp de 2012-01-10 23:41:04.348724000, iar fișierul sincronizat are timestamp 2012-01-10 23:41:04.000000000, atunci acesta este un semn al unei diferențe de precizie.

Opțiunea rsync --modify-window=1 poate face față acestei diferențe de precizie permițând o diferență mică.

Chirael

După testare, cred că răspunsul la această întrebare este da.

În ceea ce privește motivul pentru care nu am testat acest lucru de la bun început înainte de a întreba, am înțeles greșit modul în care funcționează rsync și am crezut că întotdeauna trebuie să configurați un daemon rsync pe server.

Cu toate acestea, dacă utilizați ssh ca mecanism de transfer, nu este nevoie de un daemon rsync pe server, ci doar un daemon ssh, ceea ce este mult mai frecvent.

În cadrul testelor mele, un fișier mai nou, modificat pe calculatorul local a fost suprascris de fișierul mai vechi de pe server (chiar dacă am folosit opțiunea –update).

Concluzia mea este că rsync este mai bun pentru copierea/actualizarea master-slave, mai degrabă decât pentru o sincronizare bidirecțională adevărată, bazată pe omologi.

Va trebui să mă interesez de Mercurial sau, eventual, de Microsoft SyncToy (deoarece ambele mașini rulează XP); probabil că voi opta pentru aceasta din urmă, deoarece este vorba de o rețea casnică simplă.

Comentarii

  • acest lucru nu ar trebui să fie. Rsync previne ca un fișier mai nou să fie suprascris de un fișier mai vechi. Dacă sincronizați de pe server pe client, ar trebui să primiți mesajul „[fișierul] este mai nou”. Verificați marcajul/zona de timp și setările. –  > Por makstaks.
steveh

Ați încercat să executați rsync –update de două ori. S-ar putea să mă înșel, dar cred că următoarea pereche de comenzi ar realiza o sincronizare bidirecțională.

rsync -avz –stats –update geezer/ merlin

rsync -avz -avz –stats –update merlin/ geezer

aici este doar sincronizarea a 2 directoare geezer și merlin, dar cred că ar trebui să se comporte la fel dacă sursa și directorul ar fi căi complete, inclusiv numele mașinilor.

Comentarii

  • Prima comandă nu ar putea suprascrie fișierele modificate pe merlin? Adică, dacă foo.txt se află atât pe geezer, cât și pe merlin, dar a fost modificat cel mai recent pe merlin, nu ar fi suprascris de foo.txt de pe geezer? –  > Por Sam Odio.