การจัดการไฟล์หรือไดเรกทอรีที่ถูกเปลี่ยนชื่อใน rsync


26

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

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

ฉันจะเก็บไฟล์และไดเรกทอรีให้ตรงกันได้อย่างไรถ้ามีคนเปลี่ยนชื่อบางอย่างโดยยังคงคัดลอกเฉพาะไฟล์ใหม่หรือที่แก้ไขแล้วเท่านั้น นี่คือไฟล์ที่เป็นปัญหา

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

หรือจะมีวิธีแม้แต่ย้ายไฟล์ที่ถูกเปลี่ยนชื่อไปยังไดเรกทอรีอื่นว่า: /mymounts/VerControl?

คำตอบ:


23

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

เราลงเอยด้วยวิธีแก้ปัญหาง่ายๆที่สร้างแผนผังที่ซ่อนอยู่ของฮาร์ดลิงก์ภายในไดเรกทอรีต้นทาง / เป้าหมายสคริปต์พื้นฐานอาจเป็นดังนี้:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

ฉันมีสคริปต์ตัวอย่างบน GitHub แต่ฉันแนะนำให้คุณทำการทดสอบจำนวนมากก่อนที่จะใช้วิธีนี้ในการผลิต


นอกจากนี้ "คำอธิบายที่ยอดเยี่ยม" ที่คุณเชื่อมโยงไปยังอ้างถึงrsyncบทความพื้นฐานที่ยอดเยี่ยมนี้ FWIW everythinglinux.org/rsync
JakeGould

19

คุณอาจต้องการดู-y | --fuzzyตัวเลือก rsync นอกจากนั้น rsync ไม่มีวิธีการติดตามการเปลี่ยนชื่อดังนั้นคุณจะสิ้นสุดการถ่ายโอนไฟล์ที่ถูกเปลี่ยนชื่อ

จาก rsync manpage:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.

7
โปรดทราบว่าถ้าใช้--fuzzyคุณควรพิจารณาการมีเพศสัมพันธ์กับ--delete-delayเป็น"rsync โดยค่าเริ่มต้นไม่ได้--delete-beforeจึงออกไฟล์ฐานก่อนที่มันจะสามารถคัดลอก / ย้าย" ที่มา: Sonia Hamilton
Ronan Jouchet

1

คุณทำไม่ได้

Rsync มีสามโหมด

  • คัดลอกไฟล์ทั้งหมด
  • คัดลอกไฟล์ที่มีอยู่ (แก้ไข / ไม่ดัดแปลง) - ในที่นี้คุณมีตัวเลือกมากมาย
  • คัดลอกไฟล์ที่ไม่มีอยู่

อย่างไรก็ตามโหมดทั้งสามนี้มีหมวดหมู่ย่อยสองหมวด

  • ไม่รวมใน
  • รวมถึง

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

rsync [..stuff..] --exclude 'lib/'

gotcha ขอบคุณสำหรับการป้อนข้อมูลจะต้องอยู่กับไฟล์ที่ถูกเปลี่ยนชื่อแล้ว
jmituzas

คุณสามารถลบมันไฟล์ที่ไม่มีอยู่นั่นเป็นเรื่องที่สมบูรณ์แบบ แต่เป็นฟังก์ชั่นการคัดลอกหากคุณเปลี่ยนชื่อแหล่งที่มามันจะคัดลอกไฟล์ที่เปลี่ยนชื่อ
Evan Carroll

ฉันสามารถเก็บเวอร์ชันด้วย -b และตั้งคำต่อท้าย = date +%Y%m%d%k%M%Sอย่างไรก็ตามฉันสามารถรับส่วนต่อท้าย = date +%Y%m%d%k%M%S.ORIGINALSUFFIX ได้หรือไม่
jmituzas

0

เท่าที่ฉันรู้rsyncไม่สามารถรู้จักการเปลี่ยนชื่อไฟล์ไฟล์ใหม่จะต้องโอนอีกครั้ง ดูคำตอบของอาร์ตี้

ในการลบไฟล์ที่หายไปตรวจสอบให้แน่ใจว่าได้ใช้--deleteตัวเลือก

นอกจากนี้สำหรับการมิเรอร์ฉันขอแนะนำให้คุณใช้-a( เก็บถาวร ) ซึ่งใช้นามแฝงตัวเลือกที่ดี

ลองดูที่man 1 rsyncรายละเอียด


ขอบคุณที่จะทำงาน - ลบ / mymounts / test1 / / mymounts / test2 /
jmituzas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.