Execut Fedora 17 pe 64 de biți și rsync --exclude=/home/ben/<dir>
nu funcționează conform așteptărilor .
Încerc să rsync
directorul meu de acasă pe o unitate thumb, dar vreau să exclud cu siguranță directoarele care conțin fișiere cache și creează fișiere. Aceasta este comanda pe care o folosesc:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/
Cu toate acestea, conținutul din ~/build
și ~/.ccache
este copiat de rsync
. Ce fac greșit?
Comentarii
- Cred că modelele de excludere nu funcționează doar '.
Răspunde
Global rsync
regulile de filtrare care încep cu un /
principal sunt ancorate la rădăcina Citat din secțiunea „INCLUDE / EXCLUDE PATTERN RULES” din pagina manuală:
dacă modelul începe cu a / atunci este ancorat la un un anumit loc din ierarhia fișierelor, altfel este asortat cu sfârșitul căii. Acest lucru este similar cu un ^ în expresiile regulate. Astfel, „/ foo” s-ar potrivi cu numele „foo” fie la „rădăcina transfer „(pentru o regulă globală) sau în directorul fișierului de îmbinare” (pentru o regulă per director).
În comanda dvs. (rsync ... -arv /home/ben home-ben/
), fișierul ar fi transferat către home-ben/ben/foo
. Rădăcina transferului este home-ben
, iar calea corectă a filtrului este /ben/foo
. Astfel,
- pentru a se potrivi cu
/home/ben/.ccache
aveți nevoie de o cale de filtrare de/ben/.ccache
- pentru a se potrivi cu
/home/ben/build/
aveți nevoie de o cale de filtrare de/ben/build/
O explicație mai detaliată poate fi găsit în secțiunea „ANCHORING INCLUDE / EXCLUDE PATTERNS” din secțiunea rsync(1)
pagina manuală .
Rețineți că simpla eliminare a /
nu este neapărat ceea ce doriți. Citând din nou din aceeași secțiune de pagină manuală:
Un „foo” necalificat s-ar potrivi cu numele de „foo” oriunde în arborele deoarece algoritmul este aplicat recursiv de sus în jos; se comportă ca și cum fiecare componentă a căii primește o întoarcere la sfârșitul numelui fișierului. Chiar și „sub / foo” neacordat s-ar potrivi în orice punct al ierarhiei în care s-a găsit un „foo” într-un director numit „sub”. Consultați secțiunea privind ANCORAREA INCLUDE / EXCLUDE PATTERNS pentru o discuție completă despre cum să specificați un model care se potrivește la rădăcina transferului.
Astfel, un model de filtrare de build/
se va potrivi cu un director de compilare oriunde în /home/ben
, chiar /home/ben/many/sub/directories/build/
.
Comentarii
- Detaliul cheie este că barele contează . Dacă adăugați o bară la sfârșitul directorului sursă (rsync -a sursă / destinație) va copia conținutul sursei, altfel
rsync -a source destination
copiază direct directorul sursă la destinație. Aceasta determină care va fi rădăcina transferului pentru a informa expresia de excludere. Utilizarea corectă a / în expresia exclude este apoi explicată mai sus. Rețineți în special cărsync --exclude='/dir1' source destination
a câștigat ' pentru a nu exclude nimic.
Răspuns
AVERTISMENT: Per @ rubo77 „comentariul de mai jos , acest răspuns trebuie utilizat numai dacă sunteți dispus să excludeți aceste elemente peste tot în arborele sursă, nu doar la rădăcină. Consultați răspunsul @ jw013 de mai sus pentru o explicație mai amănunțită.
Cred că căile dvs. exclude
trebuie să fie relative la calea sursă. Poate încercați asta?
rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/
Aici „un test, pentru comparație:
/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
Comentarii
- Acest răspuns este greșit. Cu o cale de excludere relativă, ați exclude modelul peste tot!
- Această postare este corectă. Potrivirea este bazată pe text, nu pe inode de fișiere. Indiferent de calea afișată de ieșirea comenzii
--verbose
este formatul pe care trebuie să îl utilizați. - Acest lucru a funcționat pentru mine.
- Ce se întâmplă dacă calea sursă este ' / ' atunci absolut sunt căile relative, dar încă nu ' nu funcționează.
- Acesta este singurul lucru care a funcționat pentru mine.
Răspuns
Modelul dvs. de excludere ar funcționa, dacă rsincronizați întreaga / acasă cale, adicăfără o bară finală:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/
Dar mai bine rsincronizați conținutul folderului cu o bară finală:
rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/
Puteți utiliza și o listă de ignorare, consultați: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders
Răspuns
Am avut această problemă într-un script (nu știu dacă este cazul dvs.). Am fost pentru că am folosit această comandă într-un script și am folosit sh în loc de bash. verificați shebang-ul la începutul scriptului dvs.
Comentarii
- Cum ar provoca această problemă anume alegerea shell a interpretului shell?
Răspuns
Pentru a exclude un folder specific cu rsync, trebuie să luați în considerare calea relativă din comandă. în cazul dvs.:
rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/
unde „ben” este folderul pe care îl sincronizați