Puncte:0

rsync un director cu propriul său descendent

drapel gr

tl;dr: vreau sa rsync un director pentru propriul său descendent și apoi rsync descendentul menționat înapoi în directorul original - inclusiv ștergeri și excluderi în ambele direcții.

Înainte de a pune întrebarea evidentă: „De ce ai vrea să faci asta?” sau subliniați cât de mai bună ar fi o altă abordare, aceasta este o cerință de afaceri. Nu este alegerea mea și sunt conștient de riscuri, așa că doar răsfățați-mă. Nu intenționez să mai justific abordarea.

Detalii:

vreau sa rsync un director pentru propriul său descendent, adică un director „dedesubt” sau „în interiorul” acestuia, cum ar fi mamă la părinte/copil, de exemplu - și apoi sincronizați modificările la descendent înapoi la directorul original, de exemplu, părinte/copil la mamă, inclusiv ștergeri și excluderi în ambele direcții. Vizual, trebuie să fac asta:

părinte -> părinte/copil
parinte <- parinte/copil

Dificultățile sunt să...

  1. Preveniți recursiunea infinită atunci când treceți de la strămoș la descendent
  2. Nu ștergeți fișierele sursă la mijlocul operațiunii atunci când sincronizați descendentul înapoi cu strămoșul său (manifestat ca erori „fișierul a dispărut”)
  3. Respectați excluderile tot timpul
Puncte:0
drapel gr

Există trei părți ale soluției. În ordine...

  1. Excludeți calea directorului descendentă relativ la strămoş, de exemplu., copil la sincronizarea de la părinte/copil
  2. Folosește --sterge-dupa steag în loc de --șterge
  3. Faceți toate căile de excludere relativ la sursă, de exemplu, exclude.txt spre deosebire de /var/www/parent/exclude.txt

Iată un script de testare (cu o formatare specială pentru o ieșire mai bună):

#!/usr/bin/env bash

clar

printf „\n\e[versiunea 33mrsync:\n”
printf "%s--------------\e[39m\n"

rsync --versiune | cap -n 1
# rsync versiunea 2.6.9 protocol versiunea 29

rm -r părinte

mkdir -p părinte

atingeți parent/original.txt \
      parent/delete-from-child.txt \
      parent/exclude-from-child.txt

printf „\n\e[33mStarea originală:\n”
printf "%s---------------\e[39m\n"

arbore -a --noreport -- părinte

printf „\n\e[33mrsync la copil:\n”
printf "%s---------------\e[39m\n"

printf "rsync --archive \n --delete-after \n --exclude=exclude-from-child.txt \n "$PWD"/parent/ \n "$PWD"/parent/child\ n\n"
rsync --archive \
      --delete-after \
      --exclude=exclude-de-copil.txt \
      „$PWD”/părinte/ \
      „$PWD”/părinte/copil

arbore -a --noreport -- părinte; ecou

printf „\e[33mEfectuați modificări:\n”
printf "%s---------------\e[39m\n"

rm parent/child/delete-from-child.txt
printf "rm parent/child/delete-from-child.txt\n"
atingeți parent/child/create-in-child.txt
printf „atingeți părinte/copil/create-în-copil.txt\n”
atingeți parent/copil/exclude-from-parent.txt
printf „atingeți părinte/copil/exclude-de-părinte.txt\n\n”

printf „\e[33mrsync înapoi la părinte:\n”
printf "%s---------------------\e[39m\n"

printf "rsync --archive \n --delete-after \n --exclude=copil \n --exclude=exclude-from-child.txt \n --exclude=exclude-from-parent.txt \n „$PWD”/părinte/copil/ \n „$PWD”/părinte\n\n”
rsync --archive \
      --delete-after \
      --exclude=copil \
      --exclude=exclude-de-copil.txt \
      --exclude=exclude-din-parent.txt \
      „$PWD”/părinte/copil/\
      „$PWD”/părinte

arbore -a --noreport -- părinte; ecou
# Sau `find parent -type f; echo`, dacă nu aveți `tree`

printf „%s\n\e[33mComparație finală:\n”
printf "%s-----------------\e[39m\n"

diff --exclude=copil parinte parinte/copil; ecou

Ieșire:

versiunea rsync:
--------------
rsync versiunea 2.6.9 protocol versiunea 29

Stare inițială:
---------------
mamă
âââ delete-from-child.txt
âââ exclude-from-child.txt
âââ original.txt

rsync la copil:
---------------
rsync --arhivă
      --sterge-dupa
      --exclude=exclude-de-copil.txt
      /var/www/parent/
      /var/www/parent/child

mamă
âââ copil
â  âââ delete-from-child.txt
â  âââ original.txt
âââ delete-from-child.txt
âââ exclude-from-child.txt
âââ original.txt

Fa schimbari:
---------------
rm parent/child/delete-from-child.txt
atingeți parent/child/create-in-child.txt
atingeți parent/copil/exclude-from-parent.txt

rsync înapoi la părinte:
---------------------
rsync --arhivă
      --sterge-dupa
      --exclude=copil
      --exclude=exclude-de-copil.txt
      --exclude=exclude-din-parent.txt
      /var/www/parent/child/
      /var/www/parent

mamă
âââ copil
â  âââ create-in-child.txt
â  âââ exclude-from-parent.txt
â  âââ original.txt
âââ create-in-child.txt
âââ exclude-from-child.txt
âââ original.txt


Comparație finală:
-----------------
Numai în părinte: exclude-from-child.txt
Numai în părinte/copil: exclude-from-parent.txt
Puncte:0
drapel pk

O altă abordare ar fi să configurați monturi de legare și astfel să faceți ca cei doi arbori să pară independenți, apoi să faceți rsync în mod normal:

mkdir /mnt/parent
mkdir /mnt/child
mkdir /mnt/empty
mount --bind /path/to/parent/child /mnt/child
mount --bind /path/to/parent /mnt/parent
mount --bind /mnt/empty /mnt/parent/child

Acum, când o faci

rsync [args] /mnt/parent/. /mnt/copil/.

directorul gol /mnt/gol va masca realul /cale/la/părinte/copil director; /mnt/parent/copil va apărea goală și va evita recursiunea infinită.

Când o faci

rsync [args] /mnt/child/. /mnt/parent/.

situația va fi similară; /mnt/copil/copil/ va fi goală (din moment ce nu copiați nimic acolo în primul rând) și /mnt/parent/copil/ va apărea și gol, deci nu există riscul de a șterge ceva de acolo.

Aceasta este poate mai puțin elegantă decât soluția lui @TravisCarden, dar poate mai robustă.

drapel gr
Ce interesant! Din păcate, nu pot conta pe publicul meu țintă special care are acces la montare sau aș încerca asta, dar mulțumesc pentru idee!

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.