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
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
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, atrsync --exclude='/dir1' source destination
vandt ' t udelukker noget.