rsync ตัดสินใจอย่างไรว่าจะซิงค์อย่างไร


15

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

สถานการณ์สมมติ: ฉัน rsync -av --progress /dir/a /dir/b และมันทำสิ่งนั้น

ฉันเพิ่มไฟล์ใหม่ไปยัง / dir / a และเรียกใช้คำสั่งเดียวกันอีกครั้งมันรู้ว่ามันทำอะไรและคัดลอกไฟล์ใหม่เท่านั้น

ฉันเพิ่มไฟล์ใหม่ไปที่ / dir / a และเปลี่ยนชื่อไฟล์บางไฟล์ใน / dir / b และอาจลบบางไฟล์ด้วย

หากฉันทำงานrsync -av --progress /dir/a /dir/bอีกครั้งสิ่งที่จะถูกคัดลอก? เพียงไฟล์ใหม่เพราะมันรู้ว่าสิ่งที่ได้คัดลอกมาก่อนหน้านี้หรือไฟล์ที่ถูกเปลี่ยนชื่อ / ลบคนเกินไปเพราะพวกเขาจะไม่อยู่อีกต่อไป

และเป็นโบนัสถ้าไฟล์ที่คัดลอกมาก่อนหน้านี้มีการคัดลอกอีกครั้งจะมีวิธีการป้องกันไม่ให้เพื่อให้เพียงเพิ่มใหม่ไป / dir / a จะถูกคัดลอก?

ในขณะนี้ฉันมีความสุขในการตรวจสอบสิ่งต่าง ๆ ด้วยตนเอง แต่เมื่อข้อมูลมีขนาดใหญ่ขึ้นฉันจะต้องมีระบบอัตโนมัติมากขึ้นเพื่อทำงานนี้


3
-iธงเป็นประโยชน์มาก สำหรับทุกไฟล์จะให้สตริงการจับคู่ที่สามารถถอดรหัสเพื่อดูว่าทำไมมันจึงจับคู่ (ตั้งค่าสถานะสำหรับเวลา mod, ตั้งค่าขนาด ฯลฯ )
BowlOfRed

คำตอบ:


17

ฉันเพิ่มไฟล์ใหม่ไปยัง / dir / a และเรียกใช้คำสั่งเดียวกันอีกครั้งมันรู้ว่ามันทำอะไรและคัดลอกไฟล์ใหม่เท่านั้น

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

การตรวจสอบเริ่มต้นใช้สำหรับเวลาและขนาดในการแก้ไขไฟล์ จากman rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

และ:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

โปรดทราบว่าสิ่งเหล่านี้ไม่ได้บอกเป็นนัยโดยตัวเลือกที่คุณใช้ -aคือ:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

คำอธิบายที่ดีที่สุดที่ฉันเคยเห็น (จนถึงตอนนี้) ขอขอบคุณ
SPooKYiNeSS

2
นอกจากนี้เล็กน้อย ไฟล์ที่ถูกเปลี่ยนชื่อจะถือว่าเป็นไฟล์ที่ไม่ซ้ำกันที่ปลายทั้งสองด้าน การระบุ--fuzzyหนึ่งครั้งจะจดจำได้เหมือนกันในไดเรกทอรีเดียวกัน การใช้--fuzzyสองครั้งเพื่อขยายความสามารถนี้ไปยังตำแหน่งอื่น ดูman rsyncรายละเอียดที่ แน่นอนหนึ่งในสาเหตุหลักที่ใช้rsyncคือความสามารถในการคัดลอกเฉพาะส่วนของไฟล์ที่มีการเปลี่ยนแปลง สิ่งนี้ทำให้การถ่ายโอนผ่านเครือข่ายเร็วขึ้นมาก BTW ตัวเลือกการตรวจสอบดังกล่าวข้างต้นสำหรับคำอธิบายของวิธีการrsyncทำงาน ในกรณีส่วนใหญ่ไม่ควรใช้
Joe

6

ทั่วไป

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

เคล็ดลับ

  • ใช้ตัวเลือก-n'dry run' เพื่อตรวจสอบสิ่งที่เกิดขึ้นก่อนที่คุณจะรันrsyncบรรทัดคำสั่งของคุณ

  • สังเกตุความหมายพิเศษของเครื่องหมายสแลชต่อท้ายไดเรกทอรีต้นฉบับและดูความแตกต่างระหว่าง

    rsync -av --progress dir/a/ dir/b
    

    และ

    rsync -av --progress dir/a dir/b
    

    man rsyncซึ่งอธิบายไว้ในคู่มือการใช้งาน

ตัวอย่าง

กรณีพิเศษของคุณ (การเพิ่มไฟล์ในไดเรกทอรีต้นทาง 'a' และการลบไฟล์ออกจากไดเรกทอรีเป้าหมาย 'b') จะเพิ่มทั้งไฟล์ที่เพิ่มและไฟล์ที่คัดลอกมาก่อนหน้านี้เนื่องจากยังอยู่ในไดเรกทอรีต้นฉบับ สิ่งนี้จะเกิดขึ้นทั้งที่มีและไม่มีตัวเลือก-uและฉันไม่รู้ตัวเลือกใด ๆ ในrsyncการแก้ไขปัญหานั้นได้อย่างง่ายดายหากคุณต้องการเก็บไว้ในไดเรกทอรีต้นทาง

แต่คุณสามารถลบมันออกจากไดเรกทอรีแหล่งหรือใส่ชื่อไฟล์ลงในไฟล์excludedและใช้ตัวเลือก--exclude-from=excluded(สำหรับไฟล์จำนวนมาก) หรือเพียงแค่--exclude=PATTERNหนึ่งหรือสองสามไฟล์

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

ทางเลือก: unison

คุณอาจต้องการทดสอบเครื่องมือunisonซึ่งเป็นเครื่องมือซิงโครไนซ์ มันมีวิธีการทางสายตาเพื่อระบุกรณีพิเศษและตัดสินใจว่าจะทำอย่างไร มีรุ่น GUI ( unison-gtk)


ตัวอย่างที่ดีขอบคุณ ฉันรู้ / ในตอนท้ายฉันแค่ขอสิ่งนี้จากแอพและคิดถึงมัน (และคุณสามารถเห็นได้อย่างชัดเจนว่าฉันเพิ่งคัดลอก / โพสต์
SPooKYiNeSS

และอีกครั้งมันจะส่งก่อนที่ฉันจะเสร็จสิ้นและจะไม่ให้ฉันแก้ไขความคิดเห็นของฉัน ... คัดลอก / วางที่สอง ฉันจะดูที่เอกภพและดูว่ามันสามารถทำสิ่งที่ฉันต้องการได้หรือไม่และถ้าไม่ฉันจะกลับไปวางแผนขและทำสคริปต์
SPooKYiNeSS

ฉันใช้unison-gtkมาหลายปีแล้วและฉันก็มีความสุขกับมัน (ฉันก็ใช้rsyncเหมือนกัน)
sudodus

1

จะคัดลอกไฟล์ใหม่ใน / dir / a สิ่งที่คุณทำใน / dir / b จะถูกละเว้นยกเว้นว่าคุณใช้ตัวเลือก --delete ในกรณีดังกล่าวการเปลี่ยนชื่อไฟล์ใน / dir / b จะถูกลบ มันจะบังคับ / dir / b ให้กลายเป็นเหมือน / dir / a

เกี่ยวกับโบนัสคุณหมายถึงในกรณีของการเปลี่ยนชื่อไฟล์ใน / dir / a และจากนั้น rsyncing เป็น / dir / b? ฉันไม่คิดว่าจะมีวิธีการป้องกัน rsync เพียงแค่คัดลอกไฟล์อีกครั้งในกรณีนี้


ฉันไม่ได้คาดหวังว่าจะมีวิธีอื่นนอกเหนือจากการใช้แอตทริบิวต์เพื่อพิจารณา แต่ถ้าทำสคริปต์ตัวเล็กและจะต้องมีอีกต่อไป ขอบคุณสำหรับคำตอบของคุณอย่างน้อยตอนนี้ฉันก็รู้ว่าฉันต้องทำอะไร
SPooKYiNeSS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.