ทำไม rsync พยายามที่จะคัดลอกไฟล์ที่ทันสมัยอยู่แล้ว?


24

ฉันมีไฟล์เดียวกันสองไฟล์บนเครื่องโลคัลและไฟล์รีโมต ขนาดของมันเท่ากันและไฟล์บนเครื่องโลคัลใหม่กว่าบนรีโมต - แต่ rsync ยังคงพยายามที่จะคัดลอกไฟล์

ฉันขอ rsync ดังนี้

rsync -nv -e "ssh -p 2222" user@host:/data/file.fif data/file.fif

(ถ้าฉันไม่ได้ใช้-nตัวเลือกมันจะเริ่มต้นการดำเนินการคัดลอก)

เอกสาร Rsync ระบุอย่างชัดเจนว่าไม่ควรเกิดขึ้น:

Rsync  finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

ผลลัพธ์จากstat:

# remote file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221784    IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 286338      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1037/  platon)   Gid: ( 1047/  platon)
Access: 2013-08-08 18:40:16.907581658 +0400
Modify: 2013-07-16 12:01:09.158763284 +0400
Change: 2013-07-16 12:01:09.158763284 +0400

# local file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221792    IO Block: 4096   regular file
Device: 801h/2049d  Inode: 12987232    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1005/  platon)   Gid: ( 1003/  platon)
Access: 2013-08-08 19:02:57.146223369 +0400
Modify: 2013-08-08 19:02:57.146223369 +0400
Change: 2013-08-08 19:02:57.146223369 +0400

ทำไมสิ่งนี้ถึงเกิดขึ้น

UPDATE:

การทำrsync --size-onlyไฟล์ผลลัพธ์ไม่ถูกคัดลอก:

delta-transmission enabled
Skovorodko_Olga_45_raw.fif is uptodate
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 14 bytes  received 114 bytes  85.33 bytes/sec
total size is 1137551966  speedup is 8887124.73 (DRY RUN)

คำตอบ:


37

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

นั่นเป็นพฤติกรรมที่คาดหวัง (และปลอดภัยกว่า) ตัวอย่างเช่นสมมติว่าคุณมีสองไดเรกทอรีคือ ~ / src และ ~ / dest โดยแต่ละรายการมีไฟล์ foobar ใน ~ / src / foobar คุณเขียน "foo" และจากนั้นใน ~ / dest / foobar คุณเขียน "bar" ตอนนี้คุณ rsync ~ / src ถึง ~ / ปลายทาง คุณคาดหวังอะไร

ไฟล์ทั้งสองมีขนาดเท่ากัน แต่หนึ่งใน ~ / dest เป็นไฟล์ที่ใหม่กว่า พฤติกรรมมาตรฐาน Rsync คือการแทนที่ ~ / dest / foobar ด้วย ~ / src / foobar แน่นอนว่าไฟล์อาจเหมือนกันและไม่จำเป็น แต่ไม่มีวิธีใดที่จะรู้ได้เว้นแต่ว่าคุณจะทำการตรวจสอบหรือเปรียบเทียบบิตต่อบิต

หากคุณไม่ต้องการพฤติกรรมดังกล่าวกล่าวคือคุณต้องการให้ไฟล์ที่ใหม่กว่าในตัวรับสัญญาณถูกสงวนไว้คุณต้องใช้แฟล็ก -u (--update)

-u, --update สิ่งนี้บังคับให้ rsync ข้ามไฟล์ใด ๆ ที่มีอยู่ในปลายทางและมีเวลาแก้ไขที่ใหม่กว่าไฟล์ต้นฉบับ (หากไฟล์ปลายทางที่มีอยู่มีเวลาแก้ไขเท่ากับไฟล์ต้นฉบับไฟล์นั้นจะได้รับการอัปเดตหากขนาดต่างกัน)


2
ใช่มันเป็นปัญหาแน่นอน ฉันลืมที่จะเพิ่มการ-tตั้งค่าสถานะดังนั้นจึงไม่ได้ตั้งเวลาแก้ไขที่เหมาะสมในไฟล์ใหม่และการขอ rsync ต่อมากำลังพยายามอัปเดตไฟล์ใหม่ ขอบคุณ!
Rogach

13
@Rogach ใช้เสมอrsync -aเว้นแต่คุณจะมีเหตุผลที่ดีที่จะไม่
Gilles 'หยุดความชั่วร้าย'

ฉันได้รับปัญหาเดียวกันของ OP แต่-aในกรณีนี้จะนำไปสู่ปัญหาที่แตกต่างกันนั่นคือข้อผิดพลาดskipping directory .สาเหตุคือว่า-aมีอยู่-rและฉันคิดว่าถ้าไม่มีไดเรกทอรีภายในโฟลเดอร์จะทำให้เกิดข้อผิดพลาดนั้น มีการกล่าวถึงในโพสต์บล็อกนี้
กระวาน

@cardamom หนึ่งยังคงควรใช้-aโดยค่าเริ่มต้นแล้วปิดการใช้งานตัวเลือกใด ๆ อย่างชัดเจนรวมถึงสิ่งที่คุณไม่ต้องการด้วย--no-คำนำหน้า rsync -a --no-rในกรณีของคุณมันจะเป็น
Walf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.