rsync home vs. gyoker konyvtarbol

Fórumok

Adott ket Debian, menteni szeretnem a napi hasznaltban levo desktop gep nehany kivalasztott konyvtarat. Nem mindent, hanem csak a kivalasztottakat.

Az rsync nagyjabol mukodik is, de van egy kis furcsasag. Valamiert erosen elter a mukodese, a home konyvtarbol es a gyokerbol indulva.

A backup geprol inditom az rsyncet (majd cron, de tesztek alatt kezzel).

Miert mas a viselkedese a ket esetben?

Termeszetesen a manual vontakozo reszeit (include/exclude patternek, * / ** / ***, anchoring stb.) mar vegigturtam. De sehogy sem tudok rajonni...

Home konyvtar mentese

rsync -avi  --include-from=IncludeHome.txt  desktop:/home/kubi/ desktop/

IncludeHome.txt tartalma:

+ Documents/*** 
+ .thunderbird/***
+ .mozilla/***
- *

Tokeletesen mukodik. Kizarolag a 3 alkonyvtarat, es azok tartalmat menti rekurzivan bele a desktop/ alkonyvtarba a backup gepen.. Minden mast nyugton hagy.

Log a "-vvv" kapcsoloval:

[sender] add_rule(+ Documents/***)
[sender] add_rule(+ .thunderbird/***)
[sender] add_rule(+ .mozilla/***)
[sender] add_rule(- *)
server_sender starting pid=314042
[sender] make_file(.,*,0)
[sender] pushing local filters for /home/kubi/
[sender] hiding directory .local because of pattern *
[sender] hiding file .xsession-errors.old because of pattern *
[sender] hiding file .Xresources because of pattern *
[sender] hiding directory .gnome2_private because of pattern *
[sender] hiding directory .m2 because of pattern *
[sender] hiding directory Desktop because of pattern *
[sender] hiding directory .cache because of pattern *
[sender] hiding directory .config because of pattern *
[sender] hiding directory .thumbnails because of pattern *
[sender] hiding file .gksu.lock because of pattern *
[sender] hiding file .xsession-errors because of pattern *
[sender] hiding directory .gconf because of pattern *
[sender] hiding directory .icedove because of pattern *
[sender] hiding file .dmrc because of pattern *
[sender] hiding file .ICEauthority because of pattern *
[sender] showing directory .mozilla because of pattern .mozilla/***
[sender] make_file(.mozilla,*,2)
[sender] hiding directory .mono because of pattern *
[sender] hiding file .gnuplot_history because of pattern *
[sender] hiding file .lesshst because of pattern *
[sender] hiding directory .Skype because of pattern *
[sender] hiding file .xfigrc because of pattern *
[sender] hiding directory Steam because of pattern *
[sender] hiding file .bash_history because of pattern *
[sender] hiding directory .gimp-2.8 because of pattern *
[sender] showing directory Documents because of pattern Documents/***
[sender] make_file(Documents,*,2)

Gyokerbol inditva

rsync -avi  --include-from=IncludeRoot.txt  desktop:/ desktop/

IncludeRoot.txt tartalma:

+ home/kubi/Documents/*** 
+ home/kubi/.thunderbird/***
+ home/kubi/.mozilla/***
- *

Semmit sem ment le. Probaltam "/home/..." , illetve "- **" es "- ***" intaval is.

Ha kiszedem a "- *"-ot a vegerol, akkor persze boszen elkezd menteni.

Log a "-vvv" kapcsoloval:

[sender] add_rule(+ home/kubi/Documents/***)
[sender] add_rule(+ home/kubi/.thunderbird/***)
[sender] add_rule(+ home/kubi/.mozilla/***)
[sender] add_rule(- *)
server_sender starting pid=314324
[sender] make_file(.,*,0)
[sender] pushing local filters for /
[sender] hiding directory srv because of pattern *
[sender] hiding directory tmp because of pattern *
[sender] hiding directory sys because of pattern *
[sender] hiding directory run because of pattern *
[sender] hiding directory var because of pattern *
[sender] hiding directory opt because of pattern *
[sender] hiding file lib64 because of pattern *
[sender] hiding directory root because of pattern *
[sender] hiding directory boot because of pattern *
[sender] hiding directory dev because of pattern *
[sender] hiding directory etc because of pattern *
[sender] hiding file vmlinuz.old because of pattern *
[sender] hiding file initrd.img because of pattern *
[sender] hiding directory proc because of pattern *
[sender] hiding directory home because of pattern *
[sender] hiding directory mnt because of pattern *
[sender] hiding file lib32 because of pattern *
[sender] hiding file initrd.img.old because of pattern *
[sender] hiding file lib because of pattern *
[sender] hiding file sbin because of pattern *
[sender] hiding file bin because of pattern *
[sender] hiding directory usr because of pattern *
[sender] hiding file vmlinuz because of pattern *
[sender] hiding directory lost+found because of pattern *
[sender] hiding directory media because of pattern *

Hozzászólások

A "-*" bejegyzéssel a /home/ könyvtárat is excludáltad, ezért utána már nem foglalkozik annak a tartalmával az rsync. Vedd föl a home/ és home/kubi/ könyvtárakat a "- *" elé:

...
+ home/
+ home/kubi/
- *

Koszonom!

Tenyleg ugy mukodik, ahogy elvarnam.

[sender] add_rule(+ home/kubi/Documents/***)
[sender] add_rule(+ home/kubi/.thunderbird/***)
[sender] add_rule(+ home/kubi/.mozilla/***)
[sender] add_rule(+ home/kubi/)
[sender] add_rule(+ home/)
[sender] add_rule(- *)
server_sender starting pid=315448
[sender] make_file(.,*,0)
[sender] pushing local filters for /
...
[sender] hiding directory proc because of pattern *
[sender] showing directory home because of pattern home/
[sender] make_file(home,*,2)
[sender] hiding directory mnt because of pattern *
...
[sender] make_file(home/kubi,*,2)
[sender] hiding directory home/html because of pattern *

 

Viszont akkor sem ertem, hogy miert nem megy. Az include es exclude mintak sorrendje szamit. Ha megengedek valamit, azt egy kesobbi tiltas mar nem torli a manual szerint.

Viszont akkor sem ertem, hogy miert nem megy.

Nálam (rsync 3.2.7) a kézikönyv egyik példája így szól:

              Options -f'+ foo/' -f'+ foo/bar.c' -f'- *' would include                                                                                                                        
              only  the foo directory and foo/bar.c (the foo directory
              must be explicitly included or it would be  excluded  by
              the "- *")

Ha nem is magyarázat a miértre, de példaként illik az esetedre.

Még egy észrevétel: mivel nem abszolút pathokat írtál az include fájlba, ezért ezek a path töredékek minden könyvtár szinten érvényre jutnak. Így pl. a /home/kubi/home/home/kubi/Documents/ könyvtárat és annak tartalmát is átvinné az rsync a fenti include fájllal (ha létezne ilyen könyvtár).

Tehát helyesebb lenne a következő:

+ /home/
+ /home/kubi/
+ /home/kubi/Documents/***
+ /home/kubi/.thunderbird/***
+ /home/kubi/.mozilla/***
- *

Bár nem a kérdésre válasz, de azért észrevételezném: hasznos lehet a --delete kapcsoló is. Ha törölsz egy állományt a forráson, de korábban mentetted, akkor a mentésből az nem fog törlődni a te paramétereiddel. A --delete szerepe az lenne, hogy amit töröltél a forráson, azt gyalulja a célon is. Gondold át, szükséges-e?

kidobod ezt, es beallitasz egy rsnapshotot.

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Van egy lazán kapcsolódó rsync problémám, aminek nem nyitok új topikot, mert hasonló.

Adott egy bash script, ami bizonyos könyvtárakat menteni hivatott egy remote host-ra. Lényegi része így néz ki:

dest="backup@192.168.2.100:~/backup-host01/"

src=$HOME/storage/foo/dir1 \

$HOME/storage/foo/dir2 \

$HOME/storage/bar/dir3 \

$HOME/storage/bar/dir4"


rsync -aP --exclude='.*' $src $dest

Megjegyzendő, hogy a forrás dir-ek végén nincsen "/",
tehát pl. nem .../dir1/ hanem .../dir1 szerepel, szándékosan. Azt szeretném ugyanis, hogy a tartalmazó dir-rel együtt mentse a desztinációra a cuccokat.
Annyit szeretnék, hogy a "." kezdetű "hidden" fájlok ne kerüljenek mentésre. Azt gondoltam, erre elég lesz egy

--exclude='.*'

de nem. Ugyanúgy elmenti a . kezdetű fájlokat is.
Gondoltam biztos azért, mert ott van az elején a dir, és nincs meg a match. Így próbálkoztam a következőkkel is, sikertelenül:

/.*

*/.*

**/.*

***/.*

Talán meg tudnám oldani máshogy, de most már nem hagy nyugodni, hogy nem értem, mi történik. Miért kerülnek bele mégis mindezek ellenére a . kezdetű fájlok?
 

Háttőőő... kipróbáltam helyi és távoli targettel, ugyanez:

fisher@s2:~$ rm -fr /tmp/x ; mkdir /tmp/x;  rsync -a --exclude='.*' /home/fisher/ /tmp/x/ ; file /home/fisher/.bashrc /tmp/x/.bashrc
/home/fisher/.bashrc: ASCII text
/tmp/x/.bashrc:       cannot open `/tmp/x/.bashrc' (No such file or directory)

Mindegy hogy " vagy '

Van-e --delete és van-e --delete-excluded?

És mindegy hogy van-e perjel vagy nincs:

fisher@s2:~$ rm -fr /tmp/x ; mkdir /tmp/x;  rsync -a  /home/fisher /tmp/x ; file /home/fisher/.bashrc /tmp/x/fisher/.bashrc
/home/fisher/.bashrc:  ASCII text
/tmp/x/fisher/.bashrc: ASCII text
fisher@s2:~$ rm -fr /tmp/x ; mkdir /tmp/x;  rsync -a --exclude='.*' /home/fisher /tmp/x ; file /home/fisher/.bashrc /tmp/x/fisher/.bashrc
/home/fisher/.bashrc:  ASCII text
/tmp/x/fisher/.bashrc: cannot open `/tmp/x/fisher/.bashrc' (No such file or directory)
fisher@s2:~$ rm -fr /tmp/x ; mkdir /tmp/x;  rsync -a --exclude=".*" /home/fisher /tmp/x ; file /home/fisher/.bashrc /tmp/x/fisher/.bashrc
/home/fisher/.bashrc:  ASCII text
/tmp/x/fisher/.bashrc: cannot open `/tmp/x/fisher/.bashrc' (No such file or directory)

Elvileg pedig ennek úgy kellene működnie, ahogy gondoltad.

Kicsit verbosabb módban mit ír ki?

rsync -avvvP --exclude='.*' $src $dest

Tökön szúrom magam.

Ha kiadom konzolból a parancsot, minden oké:

rsync -aP --exclude='.*' /home/pink/foo /backup/bar/

Tökéletesen lefut.
De ha csinálok egy scriptet, és azt indítom el:

vim backup.sh
chmod 700 backup.sh
./backup.sh

ahol a backup.sh tartalma:

opts="-aP --exclude='.*'"
src="/home/pink/foo"
dest=/backup/bar/
 
rsync $opts $src $dest

Akkor az --exclude nem jut érvényre. Lemásolja a .-tal kezdődő fájlokat is.

Hol van a hiba?

Az opts változó értékadásánál. Ugyanis azáltal, hogy idézőjelek közé tettél még aposztrófokat is, ezeket az aposztrófokat is meg fogja kapni a $opts hivatkozás feldolgozása során. Akkor ugyanis már nem fogja a változó értékében szereplő '-okat shell szinten feldolgozni. Szóval totál fölösleges ehhez még tömbváltozót is csinálni, elég lenne kidobni az aposztrófokat. Ugyanis attól nem *nagyon* kell félni, hogy majd a globbing kihelyettesítődik, hiszen a globbing nem az aktuális könyvtár tetszőleges rejtett fájlját fogja oda berakni, hanem azt a néhány fájlnevet, amelyik "--exclude=." szövegel kezdődik. Ez ugyan nem garantált hogy nincsen, de nem túl valószínű.

Így próbáld.

 

opts=(-aP --exclude='.*')

src=/valami

dest=/valami_new

rsync "${opts[@]}" $src $dest

Idézet a bash man page expansion fejezetéből:

       Expansion  is  performed  on  the  command line after it has been split into words.  There are seven
       kinds of expansion performed: brace expansion, tilde expansion, parameter  and  variable  expansion,
       command substitution, arithmetic expansion, word splitting, and pathname expansion.

       The  order  of  expansions  is:  brace expansion; tilde expansion, parameter and variable expansion,
       arithmetic expansion, and command substitution (done in a left-to-right  fashion);  word  splitting;
       and pathname expansion.

A $opts behelyettesítése az a "parameter and variable expansion", majd később a .* feloldása a legvégén a "pathname expansion" fázisban történik. Ez utóbbitól a quoting vagyis az időjelezés (beleértve a macskakörmöket is) tudja megvédeni a(z akár behelyettesített) szöveget is. A tömb "${array[@]}" formában való használata esetén a kiértékelés (expansion) során a helyére beillesztett egyes tömb elemek úgy kerülnek behelyettesítésre, mintha maguk is idézőjelezve lettek volna: "${array[0]}" "${array[1]}" ... Ilyenformán a $opts ".*" eleme beillesztve védett lesz a "pathname expansion" során és nem kerül feloldásra/kiértékelésre, mint "glob pattern".

#!/usr/bin/env bash

multi_parameters=(
        "-type f"
        "-iname *.log"
        "-print0"
        "|"
        "xargs"
        "-0"
        "grep"
        "-i"
        "error"
        )

find /var/log "${multi_parameters[@]}"

Ha jól értem ilyenkor a bash az elemeket nem akarja végrehajtani azaz egy sima tömb elem lesz.

Bár a példat nem teszeltem, de az értelmezésemben a *-ot tartalmazó elem nem wildcard karakterként fog viselkedni.

Félig-meddig. Ez így a követő commandot jelenti:

find /var/log "-type f" "-iname *.log" "-print0" "|" "xargs" "-0" "grep" "-i" "error"

Minden idézőjelek közötti szöveg a findnak egy-egy paramétere lesz. A "-type f" sem két paraméter lesz "-type" és "f", hanem egyben, de a "|" is paraméter lesz és nem shell pipe és így az "xargs" és annak szánt paraméterek sem úgy működiknek, ahogy szeretnéd, hanem mind a findnak lesz egy-egy paramétere (amire az hibát is fog jelezni, hiszen a "|" és "xargs" pl. általa nem kezelt paraméterek".

Amit szeretnél, az kb. így nézne ki:

find_parameters=(
        -type f
        -iname "*.log"
        -print0
)
xargs_parameters=(
        -0
        grep
        -i
        error
)

find /var/log "${find_parameters[@]}" | xargs "${xargs_parameters[@]}"

A tömb értékeknél csak azt kell idézőjelezni, amit egyébként is kiértékelne a bash egy parancsnál. Ilyen a "*.log". Ha idézőjel nélkül írod, akkor kiértékelődne az aktuális könyvtárban találhat *.log patternek megfelelő fájlnevekre és már ezek kerülnék be a tömb elemeiként. Idézőjelentve megmarad "*.log" így a tömb elemének. A tömb használatakor pedig a "${array[@]}" forma védi meg a bash általi kiértékeléstől, mert - ahogy korábbi válaszomban részletesebben írtam - így idézőjelezve helyettesítődik be a tömb elemeként és így végül a find megkapja a -iname utáni "*.log" szövegként paraméterül és így a find fogja megkeresni az ilyen patternnek megfelelő fájlneveket.