ใช้ rsync เพื่อย้าย (ไม่คัดลอก) ไฟล์ระหว่างไดเรกทอรี?


54

ฉันใช้rsyncเพื่อคัดลอกไฟล์มาระยะหนึ่งแล้ว ความเข้าใจของฉันคือrsyncเร็วกว่าcpเมื่อบางไฟล์ที่จะถ่ายโอนอยู่ในไดเรกทอรีปลายทางแล้วถ่ายโอนเฉพาะความแตกต่างที่เพิ่มขึ้น (เช่น "deltas")

หากสิ่งนี้ถูกต้องจะมีประโยชน์ใด ๆ ในการใช้rsyncในการย้ายเนื้อหาของโฟลเดอร์Aจะพูดว่าโฟลเดอร์Bโดยที่Bว่างเปล่าหรือไม่

โฟลเดอร์Aมีข้อมูลใกล้เคียง 1TB (และมีไฟล์นับล้านในนั้น) การถ่ายโอนจะทำผ่านเครือข่ายท้องถิ่น( AและB ที่อยู่ในระบบไฟล์ที่แตกต่างกันทั้งที่ติดตั้งบนซูเปอร์คอมพิวเตอร์เช่นAคือNFSและBเป็นเงา )

นอกจากนั้นฉันควรใช้ค่าสถานะใดในการขอให้rsyncย้าย (ไม่ใช่คัดลอก) ไฟล์จากAถึงB (เช่นลบAเมื่อการถ่ายโอนเสร็จสิ้น)


7
ฉันไม่คิดว่าสามารถแทนที่rsync mvฉันคาดว่าmvจะเร็วขึ้นสำหรับประเภทระบบไฟล์ส่วนใหญ่เมื่อแหล่งที่มาและปลายทางอยู่ในระบบไฟล์เดียวกันเพราะrsyncจะต้องทำสำเนาไม่ว่าจะเกิดอะไรขึ้นและmvอาจหลีกเลี่ยงการเปลี่ยนรายการไดเรกทอรีบางรายการ สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถค้นหาrsync mvคือ--remove-source-filesคำสั่ง แต่นั่นไม่ได้ลบไดเรกทอรี
jw013

1
ขอบคุณ @ jw013! เพียงชี้แจงไฟล์ที่อยู่ในที่แตกต่างกันระบบไฟล์และการถ่ายโอนจะทำบนเครือข่าย คุณรู้หรือไม่ว่าสิ่งนั้นจะยังคงmvเร็วขึ้น?
Amelio Vazquez-Reina

1
ดีmvไม่สามารถใช้งานข้ามเครือข่าย - มันจะต้องพึ่งพาภูเขาท้องถิ่น (เช่น NFS) หากคอขวดเป็นเครือข่ายrsyncอาจจะเร็วกว่าmvเพราะrsyncสามารถบีบอัดได้
jw013

2
โดยวิธีการที่cpมี-uตัวเลือกในการคัดลอกไฟล์ต้นฉบับถ้ามันใหม่กว่าไฟล์ปลายทางหรือเมื่อไฟล์ปลายทางหายไป
เร่ง

คำตอบ:


69

คุณสามารถส่ง--remove-source-filesไปที่ rsync เพื่อย้ายไฟล์แทนการคัดลอก

แต่ในกรณีของคุณไม่มีประโยชน์ในการใช้ rsync เนื่องจากปลายทางว่างเปล่า ที่ราบmvจะทำงานให้เร็วที่สุด

ในกรณีของคุณสิ่งที่อาจสร้างความแตกต่างให้กับประสิทธิภาพคือตัวเลือกของโปรโตคอลเครือข่ายหากคุณมีตัวเลือกระหว่าง NFS, Samba, sshfs, sftp, rsync บน ssh, pip ไปสู่ ​​ssh เป็นต้นความเร็วสัมพัทธ์ของวิธีการเหล่านี้ขึ้นอยู่กับ ในขนาดไฟล์เครือข่ายและแบนด์วิดท์ของดิสก์และปัจจัยอื่น ๆ ดังนั้นจึงไม่มีวิธีให้คำแนะนำทั่วไปคุณจะต้องเรียกใช้การวัดประสิทธิภาพของคุณเอง


6
เพียงเพื่อย้ำสิ่งที่ Caleb พูดถ้าคุณกังวลเกี่ยวกับการทุจริตเนื่องจากเครือข่ายที่ไม่สม่ำเสมอ rsync สามารถทำให้เข้าใจได้เพราะมันตรวจสอบทุกไฟล์ที่มันเขียนโดยการตรวจสอบบล็อกที่มันเขียน
Daniel S. Sterling

5
--remove-source-filesเพียงลบไฟล์ที่อยู่ในแหล่งที่มา หากคุณต้องการล้างแหล่งที่มาของเราคุณจะไม่ต้องทำ rm -rf (หรือfindไดเรกทอรีและรหัสผ่านทั้งหมด-delete) บนแหล่งที่มาหลังจาก rsync ทำงานสำเร็จหรือไม่
เทรเวอร์บอยด์สมิ ธ

1
@ DanielS.Sterling rsync ไม่ได้ทำการตรวจสอบบล็อกหลังจากเขียนมัน (มันใช้ checksums เพื่อค้นหาว่าส่วนใดของไฟล์ที่มีอยู่ถูกอัพเดตและจำเป็นต้องทำการซิงโครไนซ์) คุณสามารถทำการซิงค์ครั้งที่สอง--checksumเพื่อบอกให้ทำการตรวจสอบผลลัพธ์ของการซิงโครไนซ์ครั้งแรก
Clément

19

เนื่องจาก--remove-source-filesไม่ลบไดเรกทอรีฉันออกคำสั่งต่อไปนี้เพื่อย้ายไฟล์ไปยัง ssh:

rsync -avh --progress --remove-source-files /home/user/mystuff/* user@external.server:/home/user/backup
find . -type d -empty -delete

ฉันชอบ--progressคุณลักษณะนี้เป็นการส่วนตัวเนื่องจากฉันถ่ายโอนด้วยตนเอง ลบมันหากคุณใช้สคริปต์ ฉันคาดว่ามันจะช้าลงเล็กน้อยในการถ่ายโอน findตัวเลือกลบคำสั่งเท่านั้นลบไดเรกทอรีว่าง - ไม่ใช้rm -rfเป็นมันอาจจะลบไดเรกทอรีที่ไม่ว่างเปล่าในกรณีที่ไฟล์ไม่ได้โอน -deleteตัวเลือกที่จะเปิด-depthตัวเลือกเพื่อให้ต้นไม้ไดเรกทอรีที่ว่างเปล่าจะถูกลบออกจาก "ด้านล่าง" ขึ้น


3
-deleteเป็นมาก nicer กว่า-exec rmdir {} +ฯลฯ
lkraav

1
ฉันจะข้ามเครื่องหมายดอกจันเพราะและเพียงแค่มีเครื่องหมายทับ / กับเส้นทางหากทำเช่นนี้ในพื้นที่ หากคุณใช้ดอกจัน rsync จะข้ามไฟล์ที่ซ่อนอยู่เช่น. htaccess หรือ. htpasswd (ถ้ามี)
Svetoslav Marinov

16

โดยทั่วไปแล้วGilles กล่าวว่าไม่มีข้อได้เปรียบในการใช้rsyncเพื่อย้ายไฟล์เมื่อmvจะได้งานเดียวกันที่ทำได้ง่ายขึ้นและไม่มีการเพิ่มความเร็วที่อาจเกิดขึ้นระหว่างระบบไฟล์ทั่วไป

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


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

2
ครั้งหนึ่งที่ฉันต้องการrsyncมากกว่า mv คือเมื่อฉันต้องการรักษาโครงสร้างโฟลเดอร์ (ถ้าคุณใช้--relative)
Sridhar Sarnobat

14

จะมีข้อได้เปรียบอะไรบ้างในการใช้ rsync ในการย้ายเนื้อหาของโฟลเดอร์ A, พูด, โฟลเดอร์ B, โดยที่ B ว่างเปล่า?

ฉันพบว่าตัวเองอยู่ในสถานการณ์ที่ rsync เร็วกว่า mv เพียงอย่างเดียวเนื่องจาก mv ไม่สามารถจัดการจำนวนไฟล์ในไดเรกทอรีได้ ฉันมีภาพถ่าย 1.8 ล้านภาพจากกล้องรักษาความปลอดภัยที่ใช้งานเป็นเวลา 20 วันและคำสั่ง mv ออกมาพร้อมกับความล้มเหลวเนื่องจากไม่สามารถจัดสรรทรัพยากรได้

อย่างไรก็ตาม rsync ดูเหมือนว่าจะจัดการไฟล์ทั้งหมดโดยไม่มีปัญหา


1

หากคุณต้องการรวมไดเรกทอรีซ้ำ ๆ ... ย้ายหนึ่งไดเรกทอรีไปยังไดเรกทอรีอื่นด้วยชื่อไดเรกทอรีที่อาจซ้ำกันโปรดดูคำตอบของฉันที่นี่ใน serverfault.com mvทำงานได้ไม่ดีเมื่อไดเรกทอรีมีชื่อเดียวกันและrsyncคัดลอก (อ่าน + เขียนข้อมูลเต็ม) ทุกไฟล์แทนการย้ายมัน (อ่านและเขียนข้อมูลเมตาเท่านั้น)


0

ไม่มีทางที่จะย้ายไฟล์โดยใช้ rsync เหมือนคำสั่ง Linux mv โดยใช้ - ลบไฟล์ต้นฉบับแสดงว่าคุณกำลังคัดลอกไฟล์ไปยังปลายทางแล้วลบไฟล์ (ยกเว้นไดเรกทอรี) จากแหล่งที่มา สิ่งนี้อาจบรรลุวัตถุประสงค์ของคุณในการย้ายไฟล์ แต่คุณจะไม่ประหยัดเวลาหรือการทำงานของ i / o

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