ฉันเชื่อว่าคุณสามารถใช้rsync
ในการทำเช่นนี้ การตรวจสอบที่สำคัญจำเป็นต้องใช้--existing
และ--update
สวิตช์
--existing skip creating new files on receiver
-u, --update skip files that are newer on the receiver
คำสั่งเช่นนี้จะทำ:
$ rsync -avz --update --existing src/ dst
ตัวอย่าง
สมมติว่าเรามีข้อมูลตัวอย่างต่อไปนี้
$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2
ซึ่งมีลักษณะดังนี้:
$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3
src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan 1 2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3
ตอนนี้ถ้าฉันจะซิงค์ไดเรกทอรีเหล่านี้จะไม่มีอะไรเกิดขึ้น:
$ rsync -avz --update --existing src/ dst
sending incremental file list
sent 12 bytes received 31 bytes 406.00 bytes/sec
total size is 0 speedup is 0.00
หากเราtouch
เป็นไฟล์ต้นฉบับเพื่อให้ใหม่กว่า:
$ touch src/file3
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3
การรันrsync
คำสั่งอื่น:
$ rsync -avz --update --existing src/ dst
sending incremental file list
file3
sent 115 bytes received 31 bytes 292.00 bytes/sec
total size is 0 speedup is 0.00
เราเห็นได้ว่าfile3
มันใหม่กว่าและมีอยู่ในdst/
นั้นมันจึงถูกส่ง
การทดสอบ
เพื่อให้แน่ใจว่าสิ่งต่าง ๆ ทำงานก่อนที่คุณจะตัดคำสั่งให้หลวมฉันขอแนะนำให้ใช้rsync
สวิตช์ตัว--dry-run
อื่น ลองเพิ่มอีกอัน-v
ด้วยrsync
ผลลัพธ์ที่ได้จะละเอียดยิ่งขึ้น
$ rsync -avvz --dry-run --update --existing src/ dst
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0 hash_hits=0 false_alarms=0 data=0
sent 88 bytes received 21 bytes 218.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
rsync --archive --update --existing --whole-file --itemize-changes a/ b
ดูเหมือนว่าฉันอาจจะต้องนี้: หรือตัวเลือกเหล่านั้นส่วนใหญ่ไม่จำเป็น? (ฉันเพิ่มทั้งไฟล์เพราะส่วนใหญ่เป็นไฟล์ข้อความขนาดเล็ก)