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 *
- 1146 megtekintés
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/
- *
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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/***
- *
- A hozzászóláshoz be kell jelentkezni
Igen, valoban biztonsagosabb abszolut path hasznalataval.
De epp ezert nem ertettem, hogy a kezdo "/" nelkul miert nem szimplan a vegere illeszti a mintat, es hozza le a fileokat.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
kidobod ezt, es beallitasz egy rsnapshotot.
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
+1 az rsnapshotnak; nagyon szeretem. De nem minden esetre ez a megoldás.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
A Google elso talalata (tudom, tudom, search bubble): https://askubuntu.com/questions/482916/rsync-exclude-hidden-files-doesn…
- A hozzászóláshoz be kell jelentkezni
Persze próbáltam ".*" módon is, de ugyanaz.
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
Mindegy hogy " vagy '
Igen, magam is így gondolom. Ennek ellenére próbáltam mind a kettővel. Ugyanaz.
'.*'
'/.*'
'***/.*'
'/***/.*'
Fentiek egyike se működik. Belerakja szépen a .-os fájlokat is.
Este megy neki egy -vvv aztán meglátjuk.
- A hozzászóláshoz be kell jelentkezni
Még ez lehet: "Van-e --delete és van-e --delete-excluded?"
Ha már ott vannak. Másra nem tudok gondolni.
- A hozzászóláshoz be kell jelentkezni
Ezek nem arra valók, hogy ha korábbi mentésből már ott van valami amire matchel az exclude feltétel, akkor törli a cél folderből?
Elvileg ezek nélkül is mennie kellene...
A guta megüt, hogy nem jövök rá, mi a baja. :D
- A hozzászóláshoz be kell jelentkezni
Elvileg pedig ennek úgy kellene működnie, ahogy gondoltad.
Kicsit verbosabb módban mit ír ki?
rsync -avvvP --exclude='.*' $src $dest
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
opts="-aP --exclude='.*'"
helyett
opts='-aP --exclude=".*"'
- A hozzászóláshoz be kell jelentkezni
Ennyin múlna? Na próba...
Szerk.: sajnos így se jó...
- A hozzászóláshoz be kell jelentkezni
Futtasd -x-el, akkor meglátod, mi a végső parancs.
bash -x ./backup.sh
- A hozzászóláshoz be kell jelentkezni
Hát, nincs shebang, így "ki tudja" milyen shell futtatja. Na nem mintha hinnék benne hogy ez az oka, de egy próbát megér.
- A hozzászóláshoz be kell jelentkezni
opts="-aP --exclude=.*"
Így lefut rendesen.
- A hozzászóláshoz be kell jelentkezni
Igen, a lentiek alapján kikövetkeztettem, hogy így is mennie kell. De már maradok a tömbös megoldásnál. :-)
Számomra a legfontosabb, hogy megértettem, mi okozta a problémát. Így meg tudok nyugodni.
- A hozzászóláshoz be kell jelentkezni
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ű.
- A hozzászóláshoz be kell jelentkezni
Igen, ez az infó volt az, amit eredetileg kerestem.
Az nem volt meg, hogy ott már nem dobja ki az aposztrófokat, illetve nem helyettesítődne a *
- A hozzászóláshoz be kell jelentkezni
Így próbáld.
opts=(-aP --exclude='.*')
src=/valami
dest=/valami_new
rsync "${opts[@]}" $src $dest
- A hozzászóláshoz be kell jelentkezni
Ott a pont! :D
Bakker ez működött! De miért? Illetve simán az $opts miért nem?
- A hozzászóláshoz be kell jelentkezni
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".
- A hozzászóláshoz be kell jelentkezni
Hat, mindig tanul az ember...
- A hozzászóláshoz be kell jelentkezni
Volt egy olyan intuícióm, hogy feloldódik a .* és ez a baj. Mert a többi arg mind szépen érvényre jut, csak ez az egy nem.
De nem tudtam tetten érni. Ha simán csak ki-echo-zom az rsync hívása helyett, ott még minden oké.
- A hozzászóláshoz be kell jelentkezni
Shellcheck sok blamát kiszúr. :)
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Ezt elmentem.
- A hozzászóláshoz be kell jelentkezni
Ez alapján viszont nem az történik, amire először gondoltam (kifejtődik a .*), hanem az, hogy rajta maradnak az aposztrófok.
A shellcheck-es linked első példáját kipróbálva legalábbis úgy gondolom, ennek kell történnie.
- A hozzászóláshoz be kell jelentkezni
#!/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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni