rsync exclude directory werkt niet

Ik draai Fedora 17 64-bit en de rsync --exclude=/home/ben/<dir> werkt niet zoals verwacht .

Ik probeer mijn homedirectory rsync naar een USB-stick te kopiëren, maar ik wil zeker mappen uitsluiten die cachebestanden bevatten en bestanden samenstellen. Dit is het commando dat ik “gebruik:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/ 

Inhoud van de ~/build en ~/.ccache wordt gekopieerd door rsync. Wat doe ik verkeerd?

Reacties

  • Ik denk dat patronen uitsluiten niet ' werken.

Antwoord

Globale rsync filterregels die beginnen met een voorloop / zijn verankerd aan de root van overdracht. Citeren uit de sectie “INCLUDE / EXCLUDE PATTERN RULES” van de man-pagina:

als het patroon begint met een / dan wordt het verankerd aan een bepaalde plek in de hiërarchie van bestanden, anders wordt het vergeleken met het einde van de padnaam. Dit is vergelijkbaar met een voorloop ^ in reguliere expressies. Dus / foo zou overeenkomen met de naam foo in de root van de transfer “(voor een algemene regel) of in de directory van het samenvoegbestand (voor een regel per directory).

In uw commando (rsync ... -arv /home/ben home-ben/), het bestand /home/ben/foo zou worden overgedragen naar home-ben/ben/foo. De root van de overdracht is home-ben en het juiste filterpad is /ben/foo. Dus,

  • om te matchen met /home/ben/.ccache heb je een filterpad nodig van /ben/.ccache
  • om overeen te komen met /home/ben/build/ heb je een filterpad nodig van /ben/build/

Een meer gedetailleerde uitleg kan zijn gevonden in het gedeelte “ANCHORING INCLUDE / EXCLUDE PATTERNS” van de rsync(1) man-pagina .


Merk op dat het simpelweg weglaten van de leidende / niet noodzakelijk is wat je wilt. Nogmaals citeren uit dezelfde manpage-sectie:

Een niet-gekwalificeerde “foo” komt overeen met de naam “foo” ergens in de boom omdat het algoritme wordt toegepast recursief van boven naar beneden; het gedraagt zich alsof elk padcomponent een draai krijgt als het einde van de bestandsnaam. Zelfs de niet-verankerde “sub / foo” zou op elk punt in de hiërarchie overeenkomen waar een “foo” werd gevonden in een directory met de naam “sub”. Zie de sectie over ANCHORING INCLUDE / EXCLUDE PATRONEN voor een volledige bespreking van hoe je een patroon specificeert dat overeenkomt met de root van de overdracht.

Een filterpatroon van build/ zou dus overeenkomen met een build-directory ergens in /home/ben, zelfs /home/ben/many/sub/directories/build/.

Reacties

  • Het belangrijkste detail is dat de materie doorgesneden wordt . Als je een schuine streep toevoegt aan het einde van de bronmap (rsync -a bron / bestemming), zal het de inhoud van de bron kopiëren, anders kopieert rsync -a source destination de bronmap zelf naar de bestemming. Dit bepaalt wat de root van de overdracht zal zijn om de uitsluitingsexpressie te informeren. Het juiste gebruik van / in de uitsluitingsuitdrukking wordt dan hierboven uitgelegd. Merk in het bijzonder op dat rsync --exclude='/dir1' source destination ' niets heeft uitgesloten.

Antwoord

WAARSCHUWING: Per @ rubo77 “s opmerking hieronder , moet dit antwoord alleen worden gebruikt als je bereid bent om deze items overal in je broncodestructuur uit te sluiten, niet alleen bij de root. Zie het antwoord van @ jw013 hierboven voor een meer grondige uitleg.

Ik denk dat je exclude paden relatief moeten zijn ten opzichte van het bronpad. Kunnen probeer je dit in plaats daarvan?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/ 

Hier “een test, ter vergelijking:

/tmp$ tree src dest src ├── a └── b dest └── foo/ /tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest sending incremental file list src/ src/a src/b $ rsync -nav --exclude b /tmp/src /tmp/dest sending incremental file list src/ src/a 

Opmerkingen

  • Dit antwoord is fout. Met een relatief uitsluitingspad zou je het patroon overal uitsluiten!
  • Dit bericht is correct. De afstemming is op tekst gebaseerd, niet op basis van bestands-inode. Welk pad de uitvoer van het --verbose commando laat zien, het formaat is dat je moet gebruiken.
  • Dit werkte voor mij.
  • Wat als de bronpad is ' / ' dan zijn absoluut de relatieve paden, maar het is nog steeds niet ' t werk.
  • Dit is het enige dat voor mij werkte.

Antwoord

Je uitsluitingspatroon zou werken als je het hele / home-pad rsync, dwzzonder een slash aan het einde:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/ 

Maar beter is het om de inhoud van de map te rsyncen met een slash aan het einde:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/ 

Je kunt ook een negeerlijst gebruiken, zie: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

Antwoord

Ik had dit probleem in een script (ik weet niet of het jouw geval is). Ik was omdat ik deze opdracht in een script gebruikte en ik sh gebruikte in plaats van bash. controleer de shebang aan het begin van je script.

Reacties

  • Hoe zou de shell-keuze van de shell-interpreter dit specifieke probleem veroorzaken?

Antwoord

Om een specifieke map met rsync uit te sluiten, moet je rekening houden met het relatieve pad in het commando. in jouw geval:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/ 

waarbij “ben” de map is die je synchroniseert

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *