2010-06-25 12:29:20 +0000 2010-06-25 12:29:20 +0000
126
126

Wat zijn de verschillen tussen de rsync verwijderopties?

Ik zie op de rsync man page dat er een aantal delete opties zijn, maar begrijp niet echt de verschillen tussen die opties. Wat zijn de verschillen tussen deze opties?

--del an alias for --delete-during
 --delete delete extraneous files from dest dirs
 --delete-before receiver deletes before transfer (default)
 --delete-during receiver deletes during xfer, not before
 --delete-delay find deletions during, delete after
 --delete-after receiver deletes after transfer, not before
 --delete-excluded also delete excluded files from dest dirs

Antwoorden (4)

125
125
125
2010-06-25 14:19:55 +0000
  • --del/--delete_during: Verwijdert bestanden van de bestemmingsdirectory terwijl ze worden gekopieerd (bespaart geheugen vergeleken met --delete-before: --delete-before maakt een aparte scan om te zoeken naar verwijderbare bestanden)

  • --delete: Verwijdert bestanden in de doelmap als ze niet bestaan in de bronmap.

  • --delete-before: Verwijder bestanden in de doelmap vóór het kopiëren van bestand-met-naam uit de bronmap

  • --delete-during: Bestanden in de doelmap verwijderen ALLATERDAT bestand-met-naam uit de bronmap wordt gekopieerd

  • --delete-delay: Markeer verwijdert tijdens overdracht, maar wacht tot overdracht voltooid is

  • --delete-after: Ontvanger verwijdert na overdracht, niet ervoor…Als een ander deel van de rsync extra bestanden naar elders verplaatst, zou je dit willen in plaats van --delete-delay, omdat --delete-delay beslist wat het gaat verwijderen in het midden van de overdracht, terwijl --delete-after de directory controleert op bestanden die verwijderd moeten worden NADAT alles klaar is.

  • --delete-excluded: Verwijdert bestanden uit de doelmap die expliciet zijn uitgesloten van overdracht vanuit de bronmap.

Het punt van rsync is niet kopiëren, het is archiveren. Dit is een belangrijk onderscheid. Het verwerken van verwijderde/gewijzigde bestanden is kritisch, en in veel gevallen genuanceerd.

De --delete vlag in het bijzonder is er een die ik vaak fout heb zien gaan. Veel mensen gebruiken rsync om bestanden te verplaatsen naar opslag met lage prioriteit, en in dit geval wil je dat de bestanden die je verplaatst nog bestaan in de doelmap. Dat is niet wat delete doet: --delete zorgt ervoor dat, wanneer je een bestand verwijdert uit de bron-directory, het ook verwijderd wordt uit je doel-directory, zodat je doel niet vol komt te staan met troep… Ooit zag ik iemand zijn backup wissen door er een nieuwe schijf in te zetten, en zijn nachtelijke rsync script niet uit te zetten. Het script zag dat de bron-directory nu leeg was, en verwijderde elk bestand in de doel-directory, zodat ze overeen zouden komen.

De meeste van de andere opties hebben te maken met ruimte of prestatie. Wanneer je de bestanden verwijdert is belangrijk als je er zeker van wilt zijn dat de overdracht succesvol is voordat je iets doet, maar als je apparaat te klein is om 2 kopieën van alle informatie aan te kunnen, moet je verwijderen terwijl je gaat, etc. Het is een beetje vreemd vanwege zijn lange geschiedenis op meerdere platforms: sommige opties zijn toegevoegd zodat mensen die gewend waren aan bepaald gedrag niet in de war zouden raken.

2
2
2
2013-01-17 18:50:20 +0000

Een ander punt dat het vermelden waard is, is dat als je bron map eindigt met /*, rsync alleen die bestanden in aanmerking neemt en niet de map zelf (en dus de afwezigheid van bestanden die je op de bestemming verwijderd wilt hebben).

Als je hierboven een verwijder optie specificeert, maar rsync lijkt niet te verwijderen, controleer dan of je niet per ongeluk globing gebruikt en een lijst van bestanden opgeeft terwijl je de directory zelf bedoelt.

2
2
2
2010-06-25 12:57:07 +0000

Er zijn twee dingen aan de hand:

  1. Wie doet het wissen
  2. Wanneer het gebeurt

Ofwel de verzender ofwel de ontvanger kan opdracht krijgen om het verwijderen uit te voeren (ik weet niet zeker waarom dit van belang is). Dus wanneer rsync van de ene computer verbinding maakt met de rsync server aan de andere kant, bepaalt dit wie effectief het verwijder-commando geeft.

Wanneer het gebeurt is vrij eenvoudig… voor betekent dat alle bestanden worden verwijderd, en DAN kopieert rsync de bestanden. tijdens betekent dat als het door de lijst met bestanden gaat, het ze verwijdert als het bij ze komt, en na betekent dat het wacht tot alle bestanden zijn overgezet en dan de remote kant verwijdert. Dit is alleen van belang als de overdracht wordt onderbroken.

0
0
0
2019-12-31 14:32:28 +0000

Standaard verwijdert rsync geen bestanden aan de bestemmingszijde. Om rsync überhaupt bestanden te laten verwijderen, moet je minstens één van de verwijderopties gebruiken.

Als het je niet uitmaakt wanneer bestanden worden verwijderd, gebruik dan gewoon --delete en laat de keuze aan rsync. Je kunt --delete combineren met andere verwijderopties (dit conflicteert niet), maar je hoeft het niet te doen omdat alle andere verwijderopties al --delete impliceren.

--delete-before werkt als volgt: rsync kijkt welke bestanden aanwezig zijn op de bron en welke bestanden aanwezig zijn op de bestemming, verwijdert alle bestanden die gevonden zijn op de bestemming maar niet op de bron en start dan de eigenlijke synchronisatie. Deze volgorde is nuttig als de bestemming weinig opslagruimte heeft omdat het eerst meer schijfruimte zal vrijmaken op de bestemming alvorens te beginnen met het overzetten van nieuwe bestanden. Het nadeel is dat rsync meer geheugen nodig heeft om de operatie uit te voeren en dat de hele operatie een twee-stappen proces is en dus langzamer.

--delete-during werkt als volgt: rsync begint onmiddellijk met het synchroniseren van bestanden en als het een bestand tegenkomt dat alleen op de bestemming bestaat, wordt het verwijderd. Op die manier is er geen snelheidsverlies en is er ook geen extra geheugen nodig. Het nadeel is dat het kan gebeuren dat er eerst veel nieuwe bestanden naar de bestemmingen worden gekopieerd voordat verwijderde bestanden worden verwijderd, dus de bestemming kan tijdens de operatie veel meer schijfruimte nodig hebben dan het uiteindelijk nodig heeft als de hele operatie klaar is.

--delete-after werkt als volgt: Synchroniseer eerst alle bestanden, voer dan dezelfde bewerking uit die --delete-before voor de synchronisatiefase uitvoert. Dit is de slechtste keuze in de meest voorkomende gevallen, omdat het het meeste geheugen vereist, de meeste schijfruimte op de bestemming, en het is langzamer omdat het een tweestapsproces is; in feite combineert het alle nadelen van de andere twee methoden. Deze optie bestaat hoofdzakelijk voor het geval dat u “merge files” gebruikt (wat merge files zijn en hoe ze werken valt buiten het bestek van dit antwoord). Aangezien deze bestanden regels kunnen bevatten voor bestanden die tijdens het verwijderen moeten worden uitgesloten, moeten nieuwe samenvoegbestanden vóór de verwijderingsfase worden gekopieerd als hun inhoud tijdens de verwijderingsfase in aanmerking moet worden genomen. Tenzij dat een vereiste is, heeft --delete-after geen voordeel.

--delete-delay is een vrij nieuwe optie (hij is niet beschikbaar in rsync 2.6.9, die bijvoorbeeld nog steeds de standaard is in macOS 10.15). Het werkt zoals --delete-during, behalve dat het bestanden niet onmiddellijk verwijdert maar nadat de synchronisatie gedaan is, dus het is een hybride van --delete-during en --delete-after. Het voordeel is dat het sneller is dan --delete-after, het nadeel is dat het meer geheugen nodig heeft tijdens de synchronisatie.

--delete-excluded vertelt rsync om niet alleen bestanden te verwijderen die ontbreken bij de bron, maar ook om bestanden te verwijderen op de bestemming die werden uitgesloten van synchronisatie (--exclude of --exclude-from), ongeacht of deze bestanden daadwerkelijk zouden bestaan bij de bron of niet.