ubuntuusers.de

Verständnisproblem rsync

Status: Gelöst | Ubuntu-Version: Ubuntu 13.04 (Raring Ringtail)
Antworten |

dinosaurus

Anmeldungsdatum:
19. Oktober 2010

Beiträge: 138

Hallo Kollegen,

ich sichere das Verzeichnis $HOME/user mittels rsync auf eine externe USB-Festplatte. Dabei sollen - bis auf Ausnahmen - versteckte Dateien/Verzeichnisse ausgeschlossen werden.

Dabei bereitet mir folgende rsync-Befehlszeile Kopfzerbrechen:

1
rsync -r -t -p -o -g -v --progress --delete -l -H --partial -s --include=.thunderbird --include=.mozilla --include=.tvbrowser --include=.gnupg --include=.config/gajim --include=.local/share/gajim/ --exclude=.tvbrowser/tvdata --exclude=Downloads --exclude=.gnupg/random_seed --exclude=.* --log-file=Logs/rsync.log /home/username /media/username/usbplatte

Soweit wird alles korrekt kopiert. Allerdings werden die beiden gajim-Verzeichnisse ausgelassen. Wieso? Ich hab mehrere Varianten ausprobiert - immer wird alles korrekt abgearbeitet - bis auf gajim, dies mag rsync scheinbar nicht ☹

Vielleicht kann mir jemand von euch auf die Sprünge helfen ...

TomTobin

Avatar von TomTobin

Anmeldungsdatum:
24. August 2007

Beiträge: 3101

Hallo DinoC,

--include=.local/share/gajim/

schon mal ohne den abschließenden Slash getestet? Bei den anderen Verzeichnissen hast du da auch keinen.

Gruß

Tom

dinosaurus

(Themenstarter)

Anmeldungsdatum:
19. Oktober 2010

Beiträge: 138

Hallo TomTobin,

und danke für die Antwort!

Ja, auch ohne abschließenden Slash keine Sicherung von gajim. Im Original-Script ist der Slash auch nicht vorhanden, dieser ist scheinbar beim kopieren hier reingerutscht.

TomTobin

Avatar von TomTobin

Anmeldungsdatum:
24. August 2007

Beiträge: 3101

Was machst Du eigentlich mit dem Schalter -s ? Wenn ich das richtig verstehe:

-s, --protect-args
              This option sends all filenames and most options to the remote rsync without allowing the  remote  shell  to
              interpret  them.  This means that spaces are not split in names, and any non-wildcard special characters are
              not translated (such as ~, $, ;, &, etc.).  Wildcards are expanded on the remote host by rsync  (instead  of
              the shell doing it).

ist das beim kopieren auf eine lokale USB-Platte unnötig!?

  • gibt es irgend eine Meldung beim ausslassen von gajim?

  • evtl. anderer Besitzer oder Rechte?

  • unter welchem Account läuft das Skript?

Gruß

Tom

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Warum nicht -a statt -t -p -o -g ...?

Zu den Regeln, mit ein paar mehr -v -v dazu gibt rsync aus was es wieso ablehnt.

[sender] hiding directory a/.local because of pattern .*

Die werden also abgelehnt weil das Unterverzeichnisse sind und die Include-Regel fürs Unterverzeichnis nicht zuerst getestet wird...

Das hier funktioniert (für .local/share/gajim) aber das kann nicht so ganz im Sinne des Erfinders sein:

--include=.local --include=.local/share --include=.local/share/gajim --exclude=.* --exclude=.local/* --exclude=.local/share/*

Aus der Manpage:

       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
       render  a  deeper  include  pattern  ineffectual  because rsync did not
       descend through that excluded section of the hierarchy.  This  is  par‐
       ticularly 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
              - *

Irgendwie umständlich... 😉

Wenn man die Bash expandieren läßt, vielleicht so schreiben: (auf eigene Gefahr)

rsync -a --include=.{thunderbird,mozilla,tvbrowser,gnupg,config,config/gajim,local,local/share,local/share/gajim} --exclude=.{*,gnupg/random_seed,config/*,local/*,local/share/*} src dest

Das entspricht dann rsync -a --include=.thunderbird --include=.mozilla --include=.tvbrowser --include=.gnupg --include=.config --include=.config/gajim --include=.local --include=.local/share --include=.local/share/gajim --exclude=.* --exclude=.gnupg/random_seed --exclude=.config/* --exclude=.local/* --exclude=.local/share/* src dest

dinosaurus

(Themenstarter)

Anmeldungsdatum:
19. Oktober 2010

Beiträge: 138

frostschutz, du bist der Beste!

Mit

1
rsync -a --include=.thunderbird --include=.mozilla --include=.tvbrowser --include=.gnupg --include=.config --include=.config/gajim --include=.local --include=.local/share --include=.local/share/gajim --exclude=.* --exclude=.gnupg/random_seed --exclude=.config/* --exclude=.local/* --exclude=.local/share/* src dest

funktioniert die Synchronisierung einwandfrei. Mit ein bisschen nachdenken und lesen der von dir zitierten Manpage ist dies jedoch auch logisch, wenn man versteht wie rsync die Verzeichnisebenen "verwaltet" bzw. interpretiert.

Man sollte eben doch vorzugsweise die Shell nutzen, denn der unnötige Schlangen-Schalter

Warum nicht -a statt -t -p -o -g ...?

passiert eben nur, wenn man die Gui das Script generieren lässt (Grsync), an der Konsole macht man sich mehr Gedanken und "Brian" produziert sowas eher nicht 😬

Ich bin auf jeden Fall glücklich, denn die Synchronisierung funktioniert nun super, und auch um einiges schneller als tar, welches ich eben mal alternativ probiert habe ...

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Schön daß es funktioniert.

Ich suche immer noch nach der Option --guck-dir-doch-die-ganzen-pfade-an-du-depp die scheint aber irgendwie zu fehlen...

Ich mein, es ist ja aus Performanzgesichtspunkten okay, Pfade nicht durchlaufen zu wollen wenn es nicht nötig ist, aber stell dir mal vor du willst das mit einer deutlich tieferen Verzeichnisstruktur machen, irgendwann wird es unlustig.

Da ist es ja dann einfacher das per separatem rsync-Aufruf der dann nur den gewünschten Unterordner kopiert zu regeln, als mit so einer endlos verschachtelten Filterregel.

Vielleicht findet ja doch noch jemand eine bessere Lösung.

Antworten |