Score:0

rsync ไดเร็กทอรีที่มีลูกหลานของตัวเอง

ธง gr

tl; ดร: ฉันต้องการ รีซิงค์ ไดเร็กทอรีไปยังลูกหลานของตัวเองแล้ว รีซิงค์ ลูกหลานดังกล่าวกลับไปที่ไดเร็กทอรีเดิม - รวมถึงการลบและการยกเว้นในทั้งสองทิศทาง

ก่อนที่คุณจะถามคำถามที่ชัดเจน "ทำไมคุณถึงต้องการทำเช่นนั้น" หรือชี้ให้เห็นว่าแนวทางอื่นจะดีกว่าเพียงใด นี่เป็นข้อกำหนดทางธุรกิจ มันไม่ใช่ทางเลือกของฉัน และฉันรู้ถึงความเสี่ยง ดังนั้นตามใจฉัน ฉันไม่ได้ตั้งใจที่จะปรับวิธีการนี้อีกต่อไป

รายละเอียด:

ฉันต้องการ รีซิงค์ ไดเร็กทอรีสำหรับลูกหลานของตัวเอง เช่น ไดเร็กทอรี "ข้างใต้" หรือ "ข้างใน" เช่น พ่อแม่ ถึง ผู้ปกครอง / เด็กตัวอย่างเช่น จากนั้นซิงค์การเปลี่ยนแปลงในลำดับรองลงมากลับไปยังไดเร็กทอรีเดิม เช่น ผู้ปกครอง / เด็ก ถึง พ่อแม่รวมถึงการลบและการยกเว้นในทั้งสองทิศทาง ฉันต้องทำสิ่งนี้ด้วยสายตา:

ผู้ปกครอง -> ผู้ปกครอง / ลูก
ผู้ปกครอง <- ผู้ปกครอง / เด็ก

ความยากลำบากคือการ...

  1. ป้องกันการเรียกซ้ำไม่สิ้นสุดเมื่อเปลี่ยนจากบรรพบุรุษไปยังผู้สืบทอด
  2. ไม่ลบไฟล์ต้นทางระหว่างดำเนินการเมื่อซิงค์ลูกหลานกลับไปยังบรรพบุรุษ (แสดงเป็นข้อผิดพลาด "ไฟล์หายไป")
  3. เคารพการยกเว้นตลอดเวลา
Score:0
ธง gr

มีสามส่วนในการแก้ปัญหา ในการสั่งซื้อ...

  1. ยกเว้นเส้นทางไดเร็กทอรีที่สืบทอดมา สัมพันธ์กับบรรพบุรุษ, เช่น., เด็ก เมื่อซิงค์จาก ผู้ปกครอง / เด็ก
  2. ใช้ --ลบหลังจาก ธงแทน --ลบ
  3. ทำให้เส้นทางการยกเว้นทั้งหมดสัมพันธ์กับแหล่งที่มา เช่น ไม่รวม. txt ตรงข้ามกับ /var/www/parent/exclude.txt

นี่คือสคริปต์ทดสอบ (พร้อมการจัดรูปแบบพิเศษสำหรับผลลัพธ์ที่ดีกว่า):

#!/usr/bin/env ทุบตี

แจ่มใส

printf "\n\e[เวอร์ชัน 33mrsync:\n"
printf "%s------------\e[39m\n"

rsync --version | หัว -n 1
# โปรโตคอล rsync เวอร์ชัน 2.6.9 เวอร์ชัน 29

rm -r ผู้ปกครอง

mkdir -p ผู้ปกครอง

แตะ parent/original.txt \
      parent/delete-from-child.txt \
      parent/exclude-from-child.txt

printf "\n\e[33mสถานะเดิม:\n"
printf "%s-------------\e[39m\n"

ต้นไม้ -a --noreport -- พาเรนต์

printf "\n\e[33mrsync ถึงลูก:\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 -- เก็บถาวร \
      -- ลบหลังจาก \
      --exclude=exclude-from-child.txt \
      "$PWD"/ผู้ปกครอง/ \
      "$PWD"/ผู้ปกครอง/เด็ก

ต้นไม้ -a --noreport -- หลัก; เสียงสะท้อน

printf "\e[33mทำการเปลี่ยนแปลง:\n"
printf "%s-------------\e[39m\n"

rm parent/child/delete-from-child.txt
พิมพ์f "rm parent/child/delete-from-child.txt\n"
แตะ parent/child/create-in-child.txt
printf "แตะ parent/child/create-in-child.txt\n"
แตะ parent/child/exclude-from-parent.txt
printf "แตะ parent/child/exclude-from-parent.txt\n\n"

printf "\e[33mrsync กลับไปที่พาเรนต์:\n"
พิมพ์f "%s------------------------\e[39m\n"

printf "rsync --archive \n --delete-after \n --exclude=child \n --exclude=exclude-from-child.txt \n --exclude=exclude-from-parent.txt \n "$PWD"/พาเรนต์/ลูก/ \n "$PWD"/พาเรนต์\n\n"
rsync -- เก็บถาวร \
      -- ลบหลังจาก \
      --exclude=เด็ก \
      --exclude=exclude-from-child.txt \
      --exclude=exclude-from-parent.txt \
      "$PWD"/ผู้ปกครอง/เด็ก/ \
      "$PWD"/พาเรนต์

ต้นไม้ -a --noreport -- หลัก; เสียงสะท้อน
# หรือ `ค้นหาผู้ปกครอง - ประเภท f; echo` ถ้าคุณไม่มี `tree`

printf "%s\n\e[33mการเปรียบเทียบขั้นสุดท้าย:\n"
พิมพ์f "%s------------------\e[39m\n"

diff --exclude = พ่อแม่ลูก พ่อแม่/ลูก; เสียงสะท้อน

เอาท์พุต:

เวอร์ชัน rsync:
--------------
โปรโตคอล rsync เวอร์ชัน 2.6.9 เวอร์ชัน 29

สถานะเดิม:
---------------
พ่อแม่
âââ delete-from-child.txt
âââ ไม่รวมจาก child.txt
âââ ต้นฉบับ.txt

rsync กับลูก:
---------------
rsync -- ไฟล์เก็บถาวร
      --ลบหลังจาก
      --exclude=exclude-from-child.txt
      /var/www/ผู้ปกครอง/
      /var/www/ผู้ปกครอง/เด็ก

พ่อแม่
âââ เด็ก
â âââ delete-from-child.txt
â âââ ต้นฉบับ.txt
âââ delete-from-child.txt
âââ ไม่รวมจาก child.txt
âââ ต้นฉบับ.txt

ทำการเปลี่ยนแปลง:
---------------
rm parent/child/delete-from-child.txt
แตะ parent/child/create-in-child.txt
แตะ parent/child/exclude-from-parent.txt

rsync กลับไปที่พาเรนต์:
---------------------
rsync -- ไฟล์เก็บถาวร
      --ลบหลังจาก
      --exclude=เด็ก
      --exclude=exclude-from-child.txt
      --exclude=exclude-from-parent.txt
      /var/www/ผู้ปกครอง/เด็ก/
      /var/www/ผู้ปกครอง

พ่อแม่
âââ เด็ก
â âââ create-in-child.txt
â âââ ไม่รวมจาก-parent.txt
â âââ ต้นฉบับ.txt
âââ create-in-child.txt
âââ ไม่รวมจาก child.txt
âââ ต้นฉบับ.txt


การเปรียบเทียบขั้นสุดท้าย:
-----------------
เฉพาะในพาเรนต์เท่านั้น: exclud-from-child.txt
เฉพาะในพาเรนต์/ชายด์:exclud-from-parent.txt
Score:0
ธง pk

อีกวิธีหนึ่งคือการตั้งค่าการผูกการเมานต์และทำให้ต้นไม้ทั้งสองปรากฏเป็นอิสระจากนั้น rsync ตามปกติ:

mkdir /mnt/พาเรนต์
mkdir /mnt/ลูก
mkdir /mnt/ว่าง
เมานต์ --bind /path/to/parent/child /mnt/child
เมานต์ --bind /path/to/parent /mnt/parent
เมานต์ - ผูก / mnt / ว่าง / mnt / parent / child

ตอนนี้เมื่อคุณทำ

rsync [หาเรื่อง] /mnt/parent/. /mnt/เด็ก/.

ไดเร็กทอรีว่าง /mnt/ว่าง จะสวมหน้ากากของจริง /เส้นทาง/ถึง/ผู้ปกครอง/เด็ก ไดเรกทอรี; /mnt/ผู้ปกครอง/เด็ก จะว่างเปล่าและจะหลีกเลี่ยงการเรียกซ้ำไม่สิ้นสุด

เมื่อคุณทำ

rsync [หาเรื่อง] /mnt/child/. /mnt/parent/.

สถานการณ์จะคล้ายกัน /mnt/เด็ก/เด็ก/ จะว่างเปล่า (เนื่องจากคุณไม่ได้คัดลอกสิ่งใดไว้ตั้งแต่แรก) และ /mnt/ผู้ปกครอง/เด็ก/ จะปรากฏว่างเปล่าด้วย ดังนั้นจึงไม่มีความเสี่ยงในการลบข้อมูลใดๆ จากที่นั่น

นี่อาจดูสวยงามน้อยกว่าโซลูชันของ @TravisCarden แต่อาจแข็งแกร่งกว่า

gr flag
น่าสนใจแค่ไหน! น่าเสียดายที่ฉันไม่สามารถนับได้ว่ากลุ่มเป้าหมายเฉพาะของฉันมีสิทธิ์เข้าถึงหรือฉันจะลองทำเช่นนี้ แต่ขอบคุณสำหรับแนวคิดนี้!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา