rsync ekskluder bibliotek, der ikke fungerer

Jeg kører Fedora 17 64-bit og rsync --exclude=/home/ben/<dir> fungerer ikke som forventet .

Jeg prøver at rsync mit hjemmekatalog til et tommelfinger-drev, men jeg vil bestemt udelukke mapper, der indeholder cache-filer og bygger filer. Dette er kommandoen, jeg bruger:

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

Indhold fra ~/build og ~/.ccache kopieres af rsync. Hvad laver jeg forkert?

Kommentarer

  • Jeg tror, ekskluder mønstre bare ' fungerer ikke.

Svar

Globale rsync filterregler, der begynder med en førende / er forankret til roden af overførsel. Citering fra afsnittet “INKLUDER / UDELUKKER MØNSTERREGLER” på mandsiden:

hvis mønsteret starter med a / så er det forankret i et bestemt sted i hierarkiet af filer, ellers matches det mod slutningen af stienavnet. Dette svarer til en ledende ^ i regulære udtryk. Således “/ foo” ville matche et navn på “foo” på enten “roden af overfør “(for en global regel) eller i fletfilens mappe (for en regel pr. katalog).

I din kommando (rsync ... -arv /home/ben home-ben/), filen /home/ben/foo overføres til home-ben/ben/foo. Roden til overførslen er home-ben, og den korrekte filtersti er /ben/foo. Således

  • for at matche /home/ben/.ccache har du brug for en filtersti på /ben/.ccache
  • for at matche /home/ben/build/ har du brug for en filtersti på /ben/build/

En mere detaljeret forklaring kan være fundet i afsnittet “ANCHORING INCLUDE / EXCLUDE Mønstre” i rsync(1) man-siden .


Bemærk, at det simpelthen ikke er det, du ønsker at bare udelade det førende /. Citerer igen fra det samme mandesektionsafsnit:

En ukvalificeret “foo” svarer til navnet “foo” hvor som helst i træet, fordi algoritmen anvendes rekursivt ovenfra og ned; det opfører sig som om hver stykomponent får en drejning ved at være slutningen af filnavnet. Selv den ikke-forankrede “sub / foo” ville matche på ethvert tidspunkt i hierarkiet, hvor en “foo” blev fundet i en mappe med navnet “sub”. Se afsnittet om forankring inkluderer / udelukker mønstre for en fuldstændig diskussion af, hvordan du angiver et mønster, der matcher roden til overførslen.

Således ville et filtermønster på build/ matche en build-mappe hvor som helst i /home/ben, endda /home/ben/many/sub/directories/build/.

Kommentarer

  • Det vigtigste er, at skråstreg betyder noget . Hvis du tilføjer et skråstreg i slutningen af kildekartoteket (rsync -a kilde / destination), kopierer det kildens indhold, ellers kopierer rsync -a source destination selve kildekataloget til destinationen. Dette bestemmer, hvad roden til overførslen er for at informere ekskluderingsudtrykket. Den korrekte anvendelse af / i ekskluderingsudtrykket forklares derefter ovenfor. Bemærk især, at rsync --exclude='/dir1' source destination vandt ' t udelukker noget.

Svar

ADVARSEL: Per @ rubo77 “s kommentar nedenfor , dette svar bør kun bruges, hvis du er villig til at ekskludere disse varer overalt i dit kildetræ, ikke kun ved roden. Se @ jw013s svar ovenfor for en mere grundig forklaring.

Jeg tror, at dine exclude stier skal være relative til kildestien. Kan prøver du dette i stedet?

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

Her “er en test til sammenligning:

/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 

Kommentarer

  • Dette svar er forkert. Med en relativ ekskluderingssti vil du ekskludere mønsteret overalt!
  • Dette indlæg er korrekt. Matchningen er tekstbaseret, ikke filinode-baseret. Uanset hvilken sti output fra --verbose kommandoen viser, er det format, du skal bruge.
  • Dette fungerede for mig.
  • Hvad hvis kildesti er ' / ' så absolut er de relative stier, men det er stadig ikke ' t fungerer.
  • Dette er det eneste, der fungerede for mig.

Svar

Dit ekskluderingsmønster fungerer, hvis du synkroniserer hele / hjemmestien, dvs.uden et skråstreg:

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

Men bedre rsynkroniser kun indholdet af mappen med et skråstreg:

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

Du kan også bruge en ignoreringsliste, se: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

Svar

Jeg havde dette problem i et script (jeg ved ikke, om det er din sag). Jeg var fordi jeg brugte denne kommando i et script, og jeg brugte sh i stedet for bash. tjek shebang i begyndelsen af dit script.

Kommentarer

  • Hvordan ville shell-valg af shell-tolk forårsage netop dette problem?

Svar

For at udelukke en bestemt mappe med rsync skal du overveje den relative sti i kommandoen. i dit tilfælde:

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

hvor “ben” er den mappe, du synkroniserer

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *