rsync exclude/include

Bash, Shell, PHP, Python, Perl, CGI
zucker4
Posts: 24
Joined: 2004-11-23 13:08

rsync exclude/include

Post by zucker4 » 2007-06-29 16:57

Tag Leute!


Folgendes -

ich versuche krampfhaft ein Skript zusammenzubasteln, welches
mir mittels rsync die gewünschten Verzeichnisse kopiert.

Das kommando ist an sich einfach

Code: Select all

rsync -avz --exlude-from="/etc/rsync-excludes" / /backup
Die Datei /etc/rsync-excludes enthält dabei Zeilen wie

Code: Select all

/data
/opt/
/tmp/
/var/run/
und noch einige andere Einträge von Ordnern, die eben NICHT mitkopiert werden sollten. So.

Das Problem ist folgendes: im Ordner "/data", der ja excludet wird,
ist neuerdings ein Ordner, denn ich gern als Kopie haben will.
Ich dachte mir, ich legen dann halt eine zweite Datei "/etc/rsync-includes"
an, und trage dort folgendes ein:

Code: Select all

/data/der-gute-stoff/
und gebe diese Datei als --include-from="/etc/rsync-includes" im Kommando mit an.


Letzten Endes also

Code: Select all

rsync -avz --exlude-from="/etc/rsync-excludes" --include-from="/etc/rsync-includes" / /backup/

Klappt aber nicht.

Habe auch zum Teil herausgefunden woran's liegt - in dem Moment wo
die komplette Liste der zu kopierenden Daten gemacht wird, wird
mein gewünschter ordner "/data/der-gute-stoff/" mit der EXCLUDE-Regel des "/data" quasi überschrieben und deswegen nicht mitkopiert.


Ich habe schon die "man rsync" gründlich studiert, aber die Erklärungen dort
sind irgenwie nicht eindeutig.

Z.B. wird folgendes gesagt:

Code: Select all

      Note  that, when using the --recursive (-r) option (which is implied by
       -a), every subcomponent of every path is visited from the top down,  so
       include/exclude patterns get applied recursively to each subcomponent’s
       full name (e.g. to include "/foo/bar/baz" the subcomponents "/foo"  and
       "/foo/bar" must not be excluded).  The exclude patterns actually short-
       circuit the directory traversal stage when rsync  finds  the  files  to
       send.  If a pattern excludes a particular parent directory, it can ren‐
       der a deeper include pattern ineffectual because rsync did not  descend
       through  that  excluded section of the hierarchy.  This is particularly
       important when using a trailing ’*’ rule.   For  instance,  this  won’t
       work:

              + /some/path/this-file-will-not-be-found
              + /file-is-included
              - *

       This  fails  because the parent directory "some" is excluded by the ’*’
       rule, so rsync  never  visits  any  of  the  files  in  the  "some"  or
       "some/path" directories.  One solution is to ask for all directories in
       the hierarchy to be included by using a single rule:  "+  */"  (put  it
       somewhere   before   the   "-   *"   rule),   and   perhaps   use   the
       --prune-empty-dirs option.  Another solution is to add specific include
       rules  for  all the parent dirs that need to be visited.  For instance,
       this set of rules works fine:

              + /some/
              + /some/path/
              + /some/path/this-file-is-found
              + /file-also-included
              - *

Ich werde einfach nicht schlau daraus...


Kann einer da helfen?

Danke für eure Mühe!

dtdesign
RSAC
Posts: 395
Joined: 2006-09-05 21:12
Location: Berlin

Re: rsync exclude/include

Post by dtdesign » 2007-06-29 19:19

Quick&Dirty&Untested

Symlink setzen

Das könnte man so ausweiten, dass man in einem Verzeichnis nur Symlinks hat... falls es funktioniert.

jg1
Posts: 52
Joined: 2005-10-20 14:47

Re: rsync exclude/include

Post by jg1 » 2007-06-29 22:36

Hallo,

da ich kein rsync benutze, kann ich nur versuchen die Hilfe zu interpretieren:

Also

include:

/data/
/data/guter-stoff/
/data/guter-stoff/*

exclude:

/data/* oder evtl. nur /data/

Probier mal, ob das geht....

Viel Glück :-D

Nachtrag:
Ich habe es eben mal ausprobiert. Es geht, aber nur wenn man erst include und dann exclude angibt:

Code: Select all

rsync -av --include-from="/tmp/data/include"  --exclude-from="/tmp/data/exclude" /tmp/ /temp/
building file list ... done
./
data/
data/guter-stoff/
data/guter-stoff/test.txt

sent 334 bytes  received 60 bytes  788.00 bytes/sec
total size is 155  speedup is 0.39
include-Datei:

Code: Select all

/data/
/data/guter-stoff/
/data/guter-stoff/*
exclude-Datei:

Code: Select all

/data/*

zucker4
Posts: 24
Joined: 2004-11-23 13:08

Re: rsync exclude/include

Post by zucker4 » 2007-06-30 14:43

dtdesign wrote:Quick&Dirty&Untested

Symlink setzen

Das könnte man so ausweiten, dass man in einem Verzeichnis nur Symlinks hat... falls es funktioniert.
:?
:?
Werde ich nicht machen können; weil das zu backup-ende Volume readonly gemountet wird.

zucker4
Posts: 24
Joined: 2004-11-23 13:08

Re: rsync exclude/include

Post by zucker4 » 2007-06-30 14:52

grewe wrote:Hallo,

da ich kein rsync benutze, kann ich nur versuchen die Hilfe zu interpretieren:

Also

include:

/data/
/data/guter-stoff/
/data/guter-stoff/*

exclude:

/data/* oder evtl. nur /data/

Probier mal, ob das geht....

Viel Glück :-D

Nachtrag:
Ich habe es eben mal ausprobiert. Es geht, aber nur wenn man erst include und dann exclude angibt:

Code: Select all

rsync -av --include-from="/tmp/data/include"  --exclude-from="/tmp/data/exclude" /tmp/ /temp/
building file list ... done
./
data/
data/guter-stoff/
data/guter-stoff/test.txt

sent 334 bytes  received 60 bytes  788.00 bytes/sec
total size is 155  speedup is 0.39
include-Datei:

Code: Select all

/data/
/data/guter-stoff/
/data/guter-stoff/*
exclude-Datei:

Code: Select all

/data/*
Ne, sorry, da hast Du was falsch verstanden -

rsync's Syntax ist:

Code: Select all

rsync [OPTION]... SRC [SRC]... DEST
d.h. der ich will nicht "/tmp/" nach "/temp" kopieren, sondern nur "/data/the-good-stuff" nach XXX. Die restlichen Verzeichnisse - "/data/the-bad-stuff" && "/data/the-bad-stuff-2" will ich sein lassen.

Und Präferenzen - ob include oder exclude als "erster" dran kommt - gibt's (laut man) nicht.

jg1
Posts: 52
Joined: 2005-10-20 14:47

Re: rsync exclude/include

Post by jg1 » 2007-06-30 22:51

Hallo!

Es sollte eigentlich nur ein Beispiel sein, von wo nach wo und was includes oder excluded wird musst Du selbst einsetzen. Ausserdem habe ich es ausprobiert und es funktioniert nur wenn erst include und dann exclude kommt. Aber wenn Du meinst, lass es einfach :)