Puncte:2

rsync all pdfs except in certain directories?

drapel cn

I'm trying hard to understand the rsync filter system, and it's completely baffling me.

I have the following "test" directory structure to try to make sense of it. With no filter options here are all my files:

rsync -amv --dry-run /source /target

building file list ... done
source/
source/1.pdf
source/2.pdf
source/exclude_rules.txt
source/filter_rules.txt
source/excludedir/
source/excludedir/2.jpg
source/excludedir/4.pdf
source/subdir/
source/subdir/1.jpg
source/subdir/1.txt
source/subdir/3.pdf
source/subdir/subdir2/
source/subdir/subdir2/6.jpg
source/subdir/subdir2/6.pdf

I just want to sync all *.pdf files except in certain directories, namely any directory that has *exclude* in it.

I'm using a file with the filter rules in it with the following command:

rsync -amv --dry-run --filter='merge /filter_rules' /source /target

The filter_rules look like variations on the following but I can't get them to produce the results I'm after:

-/ *exclude*/
+/ *.pdf
-/ *

The closest I've come is with the simple exclude:

-/ *exclude*/

Which yields:

building file list ... done
source/
source/1.pdf
source/2.pdf
source/exclude_rules.txt
source/filter_rules.txt
source/subdir/
source/subdir/1.jpg
source/subdir/1.txt
source/subdir/3.pdf
source/subdir/subdir2/
source/subdir/subdir2/6.jpg
source/subdir/subdir2/6.pdf

How do I filter the rest to just get *.pdf ?

Puncte:1
drapel cn

Pentru posteritate, am reușit în sfârșit să funcționeze și iată instrucțiunile pe care mi-aș fi dorit să le fi avut:

  • rsync începe procesul de filtrare cu o listă completă de fișiere
  • regulile de filtrare sunt gestionate ÎN ORDINE (mi-a luat ceva timp să obțin asta)
  • Este posibil să aveți toate regulile potrivite, dar nu ordinea corectă, așa că, dacă utilizați fișiere de excludere sau includere externe, este posibil să fie nevoie să fie reordonate cu un fișier de filtrare care vă permite să amestecați și să potriviți regulile de includere/excludere, sau listate pe cli în sine
  • pentru fiecare fișier, PRIMA REGULĂ DE FILTRARE CARE SE POAREȘTEște pune fișierul într-una dintre cele 2 găleți, include sau exclude.
  • Regulile după prima regulă de potrivire nu se aplică!
  • Fiecare regulă acționează numai asupra fișierelor care au făcut-o să „trece” regulile anterioare nefiind potrivite
  • Fișierele care nu se potrivesc cu nicio regulă sunt INCLUSE
  • Ultima regulă este cea mai importantă și neintuitivă și înseamnă să excludeți tot ceea ce nu a fost inclus în mod specific PÂNĂ ACEL PUNCT.

Deci, iată ce a sfârșit prin a funcționa:

-/ *exclude*/
+/ */
+/ *.pdf
-/*

Inițial, aveam acele reguli în fișiere separate include-from și exclude-from, iar asta nu permitea ordinea corectă.

TomOnTime avatar
drapel pt
Recuzite pentru a returna și a posta ceea ce ați învățat și cum l-ați învățat!
Puncte:0
drapel jp

Încă folosesc --exclude-from în rsync-ul meu, dar acest link a fost remarcabil de util când am încercat să funcționeze filtrarea.

https://stackoverflow.com/questions/35364075/using-rsync-filter-to-include-exclude-files

edit - OP a dat acest lucru în propriul său răspuns, dar așa cum a fost solicitat... un pic util din acel link

Explicatii:

(doar reformulând manualul în cele din urmă, dar după cum ați spus, manualul este puțin >criptic)

Regulile sunt citite de sus în jos de fiecare dată când un fișier trebuie transferat prin >rsync. Dar în cazul dvs. /mnt/data/i-want-to-rsyncthisdirectory/ nu are >back-up pentru că excludeți /mnt și acest lucru scurtcircuitează regulile dvs. de includere. Deci soluția este să includeți fiecare folder și subfolder până la >dosarul pe care doriți să îl faceți copii de rezervă și apoi să excludeți ceea ce nu doriți să faceți copii de rezervă >subfolder cu subfolder.

Notați * la sfârșitul fiecărei excluderi de subfolder. Acesta va împiedica rsync să facă copii de rezervă > fișiere și foldere situate în aceste subfoldere, ceea ce este ceea ce doriți, cred. Soluție mai simplă: (editare 2)

Puteți chiar să simplificați acest lucru cu modelul *** care a fost adăugat în versiunea >2.6.7:

  • /mnt/
  • /mnt/data/
  • /mnt/data/i-want-to-rsyncthisdirectory/***
  • /mnt/**

Acest operator vă permite să utilizați caracterul metalic ** pentru excludere și, prin urmare, să aveți o singură linie de excludere.

De asemenea, am descoperit că puteți înțelege ce reguli de filtrare exclud/includ > fiecare fișier sau folder datorită următoarelor argumente rsync:

--verbos --verbos

Combinat cu argumentul --dry-run, ar trebui să puteți depana problema dvs. >:)

drapel cn
Mulțumesc pentru răspuns! Puteți extrage elementele care au fost cele mai utile, în cazul în care întrebarea sau răspunsurile vor fi șterse în viitor?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.