rsync exclude director care nu funcționează

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *