วิธี rsync เฉพาะไฟล์ใหม่


144

ฉันกำลังพยายามตั้งค่า rsync เพื่อซิงโครไนซ์เว็บเซิร์ฟเวอร์หลักของฉันไปยังเซิร์ฟเวอร์ระยะไกลโดยการเพิ่มไฟล์ที่สร้างขึ้นใหม่ในภายหลัง

นี่คือคำสั่งที่ฉันใช้:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar

แต่ดูเหมือนว่าเว็บเซิร์ฟเวอร์จะทำการถ่ายโอนไฟล์ทั้งหมดแม้ว่าจะมีการตั้งค่าสถานะ '- update' ก็ตาม ฉันได้ลองชุดค่าสถานะที่แตกต่างกัน (เช่นไม่ใช้ '-a' และใช้ '-uv' แทน) แต่ไม่มีใครช่วย ดังนั้นสงสัยว่าฉันจะแก้ไขคำสั่ง rsync เพื่อส่งไฟล์ที่เพิ่งเพิ่มใหม่ได้อย่างไร ขอบคุณ


2
หากคุณต้องการซิงค์ไฟล์ไปยังเซิร์ฟเวอร์ระยะไกลมันจะไม่มาหรือไม่ ie rsync /foo/bar remoteuser@remotehost:/foo/bar
ostrokach

คุณอาจสนใจหน้าเว็บนี้ นอกจากนี้ระวังระบบไฟล์ด้วย หากระบบไฟล์ของเซิร์ฟเวอร์ไม่รองรับ-aตัวเลือกทั้งหมดนั้นหมายถึง (เจ้าของกลุ่ม perms, ... ) มันควรเป็นสาเหตุของปัญหาของเรา
ppr

2
ไม่มีคำตอบใด ๆ ที่แก้ปัญหาไฟล์โลคัลไม่ได้คัดลอกไปยังปลายทางระยะไกลอย่างสมบูรณ์และคุณต้องการ rsync ไฟล์ที่ใหม่กว่าเท่านั้น
Axel Bregnsbo

ฉันเพิ่งพบ-cตัวเลือก มันข้ามไฟล์ที่มีอยู่ตามการตรวจสอบแทนการปรับเปลี่ยนเวลาหรือขนาด
haheute

คำตอบ:


181

จากman rsync:

--ignore-existing       skip updating files that exist on receiver

--updateทำสิ่งที่แตกต่างออกไปเล็กน้อยซึ่งอาจเป็นเหตุผลว่าทำไมคุณถึงได้ผลลัพธ์ที่ไม่คาดคิด (ดูman rsync):

กองกำลังนี้ rsync จะข้ามไฟล์ใด ๆ ที่มีอยู่ในปลายทางและมีช่วงเวลาที่มีการปรับเปลี่ยนที่ใหม่กว่าแฟ้มแหล่งที่มา (หากไฟล์ปลายทางที่มีอยู่มีเวลาแก้ไขเท่ากับไฟล์ต้นฉบับไฟล์นั้นจะได้รับการอัปเดตหากขนาดต่างกัน)


1
ดีจริงฉันลองคำสั่งด้วย '--ignore- ที่มีอยู่' แทน '- ปรับปรุง' มันเสร็จอย่างรวดเร็ว แต่ไม่ได้ใส่ไฟล์ใหม่ลงในโฮสต์ระยะไกล ความคิดใด ๆ ขอบคุณ
supermario

13
Man pages suck (ใช่แล้วฉันไปที่นั่น), ตรงประเด็น, --ignore-existingหมายความว่าอย่าถ่ายโอนไฟล์ที่มีอยู่ในผู้รับหรือไม่ถ่ายโอนไฟล์ถ้ามีไฟล์ / โฟลเดอร์ที่มีชื่อเดียวกันอยู่ในผู้รับ?
puk

7
- ปรับปรุงจะข้ามไฟล์เมื่อ mtimes เหมือนกัน (ซึ่งไม่ใช่สิ่งที่ถ้อยคำหมายถึง) ฉันทดสอบสิ่งนี้ ฉันเชื่อว่าถ้อยคำจะเข้าใจได้ดีขึ้นหากมีข้อความว่า "เฉพาะไฟล์ต้นฉบับที่ใหม่กว่าปลายทางจะถูกคัดลอก"
Octopus

4
@Octopus "ไฟล์เพียงแหล่งที่ใหม่กว่าปลายทางจะถูกคัดลอก" ... หรือไฟล์ที่มาที่มีการปรับเปลี่ยนเวลาเช่นเดียวกับคู่ของแฟ้มปลายทางของพวกเขา แต่มีขนาดแตกต่างกัน ฉันคิดว่านั่นเป็นจุดสำคัญ (คริสกล่าวถึงเรื่องนั้นแล้วขอบคุณ)
Jonathan Komar

ดังนั้นคุณต้องการ --ignore-existing และ -r (เรียกซ้ำ) -v (verbose) เป็นสิ่งที่ดีเช่นกัน :-)
DutchUncle

40

ในกรณีของฉันฉันมีปัญหาที่คล้ายกันการโอนไฟล์ทั้งหมดแทนที่จะเป็นไฟล์ที่ถูกแก้ไข / ใหม่ ฉันแก้ไขปัญหานี้โดยใช้พารามิเตอร์-t(แทน-a) และ-P(เทียบเท่า--partial --progress):

rsync -h -v -r -P -t เป้าหมายต้นทาง

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

พารามิเตอร์ในรายละเอียด:

  • -h: ตัวเลขที่มนุษย์อ่านได้
  • -v: verbose
  • -r: recurse ในไดเรกทอรี
  • -P: --partial(เก็บไฟล์ที่ถ่ายโอนบางส่วน) +
            --progress(แสดงความคืบหน้าระหว่างการถ่ายโอน)
  • -t: รักษาเวลาการแก้ไข

2
+1 สำหรับ '-a ทำมากเกินไป' (แน่นอน-rlptgoDดังนั้นการอนุญาตไม่ได้ถูกแบนกลุ่มและเจ้าของสงวนไว้ - ไม่ใช่การสำรองข้อมูลที่ปลอดภัยในการเล่นทั่วไปของฉัน ... )
Frank Nocke

2

จากประสบการณ์ของฉันกับ rsync การคัดลอกพาร์ติชั่น 1TB นั้นใหญ่เกินไปที่จะมีประสิทธิภาพ มันใช้เวลา rsync ตลอดไปในการประมวลผล ให้ทำตามไดเรกทอรีย่อยแทน นั่นคือให้เรียกใช้ rsync สำหรับแต่ละไดเรกทอรีย่อยหลัก มันจะเร็วขึ้นมากถ้าไม่ต้องเล่นไฟล์นับหมื่น


1
บางทีคุณอาจมีหน่วยความจำหมดและระบบของคุณเริ่มทำการแลกเปลี่ยน
Marcel Burkhard

-2

ลอง

rsync -zvrt --update SOURCE DESTN

8
คำอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับคำสั่งข้างต้นจะได้รับการชื่นชมสำหรับ OP
Peschke

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