มันจะดีกว่าที่จะคัดลอกและลบทุกครั้งแทนที่จะย้าย?


18

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

ฉันรู้อยู่เสมอว่าหลังจากพิมพ์บางอย่างเช่นmv verybigdir destฉันควรพิมพ์cp -R verybigdir dest  &&  rm -R verybigdir(ซึ่ง&&ผู้ดำเนินการดำเนินการกับคำสั่งถัดไปเฉพาะในกรณีที่ครั้งแรกประสบความสำเร็จ) - หรือไม่มีจุดหมายนี้หรือไม่? จะเกิดอะไรขึ้นเมื่อฉันกดCtrl+ Cครึ่งทางผ่านการเคลื่อนที่? จะเกิดอะไรขึ้นบน Windows เมื่อฉันกดปุ่มยกเลิก

ฉันไม่สามารถนับจำนวนครั้งที่ฉันย้ายบางสิ่ง (ครั้งล่าสุดคือเมื่อใช้svn) และมีสองไดเรกทอรีพร้อมเนื้อหาแยก ฉันเดาคำตอบนั้นยากเพราะบางแอปพลิเคชั่นไม่สามารถย้ายกลุ่มของไฟล์ในลักษณะเดียวกัน


16
ไม่ว่าคุณจะทำอะไรก็ไม่ต้องลบเสียก่อน
เสียงเรียกเข้า

@monotone Hilarious +1
Nick Bolton

คำตอบ:


10

บน Windows การย้ายไปยังไดรฟ์และพาร์ติชันเดียวกันจะทำหน้าที่เหมือนกับคำสั่ง mv ของ Unix และเปลี่ยนชื่อโฟลเดอร์หรือเปลี่ยนพาเรนต์ อย่างไรก็ตามถ้าคุณต้องการย้ายมันไปยังไดรเวอร์หรือพาร์ติชั่นอื่นมันจะทำการคัดลอกและลบไฟล์ตามไฟล์ดังนั้นทำไมมันจึงมีประสิทธิภาพมากกว่าในการใช้ไฟล์ tar หรือไฟล์ zip ที่ไม่มีการบีบอัดเพื่อย้ายไฟล์เร็วกว่าพาร์ติชันและฮาร์ดไดรฟ์ . หากคุณจะยกเลิกมันก็จะหยุดที่มันอยู่ ฉันเชื่อว่าสิ่งเดียวกันนี้เป็นจริงสำหรับ Unix แต่ฉันไม่ได้ทดลองมากพอที่จะแน่ใจได้ 100% มันเป็นเพียงเรื่องของการเปลี่ยนแปลง inode แต่ถ้ามันอยู่ในพาร์ทิชันหรือไดรฟ์อื่นก็จะต้องมีการคัดลอกไปยังภาคในพาร์ทิชันหรือไดรฟ์นั้น หากคุณต้องการยกเลิกระหว่างการถ่ายโอนมันจะย้ายไฟล์บางไฟล์ไปแล้วและไฟล์ที่ถูกถ่ายโอนจะเห็นมัน '

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


อาฉันไม่ได้คิดถึงการบีบอัด
Nick Bolton

คุณไม่จำเป็นต้องบีบอัดซึ่งอาจต้องใช้เวลามาก บางครั้งระดับการบีบอัดที่ 0 (ที่เก็บข้อมูล) สามารถทำงานเพื่อย้ายโฟลเดอร์ขนาดใหญ่ข้ามไดรฟ์ได้เร็วกว่ามาก
Wolf

"บน Windows การย้ายไปที่ไดรฟ์และพาร์ทิชันเดียวกันจะทำหน้าที่เหมือนกับคำสั่ง mv ของ Unix และเปลี่ยนชื่อโฟลเดอร์หรือเปลี่ยนพาเรนต์" - เมื่อใช้ Windows Explorer นั่นไม่เป็นความจริง มันไม่มากของอึก็จะใช้เวลาทุกเพศทุกวัยและคุณอาจจะจบลงด้วยการแบ่งเนื้อหาของสองไดเรกทอรีดูคำตอบนี้คำถามของฉัน
maaartinus

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

11

แม้บนคอมพิวเตอร์ที่มีเสถียรภาพอย่างสมบูรณ์แบบที่ไม่เคยล้มเหลว: ถ้าคุณดูแลเกี่ยวกับการประทับเวลาแล้วจะดีกว่าธรรมดาmvcp

( cp -aจะเก็บบันทึกเวลาสำหรับคุณและฉันคิดว่ามีสิ่งที่คล้ายกันอยู่ใน Windows)


1
อ้าเวลาประทับ ฉันไม่ได้คิดอย่างนั้น! +1
Nick Bolton

เวลาประทับมีความสำคัญอย่างสุจริต ...
Marcin

1
@Marcin พวกเขากำลังมีเหตุผลถ้าว่าสิ่งที่คุณขอ ...
Macek

10

เลขที่

คำอธิบาย:

mv verybigdir dest

เปลี่ยนชื่อ verybigdir เป็น dest นี่คือการดำเนินการปรมาณูคือไม่สามารถล้มเหลวครึ่งทาง

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

ใช่แอปพลิเคชั่นอื่น ๆ อาจย้ายไฟล์ต่างกัน


2
ที่จริงแล้วฉันคิดว่า mv บน Linux จะคัดลอก / ลบแต่ละไฟล์หรือแต่ละไดเรกทอรีแทนที่จะคัดลอกทั้งแผนผังไปยังปลายทางจากนั้นลบต้นไม้ทั้งหมดจากแหล่งที่มา ... ดังนั้นหากคุณยกเลิกไปครึ่งทางคุณจะจบลงด้วยบางส่วน ไฟล์ในทั้งสองสถานที่และไดเรกทอรีจะไม่สมบูรณ์
ปล้น

3
@rob: ไม่ไดเร็กตอรี่เป็นไฟล์เหมือนอย่างอื่น, และถือว่าเหมือนกัน. mv verybigdir/* destลักษณะการทำงานที่คุณกำลังพูดถึงจะประสบความสำเร็จกับ
dmckee

2
โดยทั่วไป mv จะจัดการกับแต่ละอาร์กิวเมนต์ด้วยวิธี "cp &&rm" ... mv verybigdir/* destแบ่ง mv ของ verybigdir ออกเป็นการดำเนินการย้ายที่แยกจากกันจำนวนมาก โปรดจำไว้เสมอว่าโปรแกรม / เครื่องมือลีนุกซ์ไม่เหมือนกับ Windows ที่เห็นว่า "*" ตรงนั้นมันขยายโดยเชลล์
Jürgen A. Erhard

4

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


3

บนยูนิกซ์, เมื่อมีการเคลื่อนไหว ไม่ข้ามขอบเขตของระบบไฟล์mvไม่ได้คัดลอกข้อมูล: เพียงแค่อัพเดตฐานข้อมูล inode ในไดเรกทอรีต่าง ๆ นี้เป็นมากเร็วกว่าcpในไฟล์ขนาดใหญ่

นอกจากนี้การใช้mvข้ามขอบเขตของระบบไฟล์เพียงแค่เรียกใช้กลไกการคัดลอกและลบแบบเงียบ ๆ

ดังนั้นฉันคิดว่าคุณควรจะชอบ mvดังนั้นผมจึงคิดว่าคุณจะชอบ


สรุปอย่างดีขึ้น
Nick Bolton

"กลไกการคัดลอกและลบ" สามารถตีความได้ว่า "คัดลอกแต่ละไฟล์แล้วลบ" หรือ "คัดลอกไฟล์ทั้งหมดจากนั้นลบทั้งหมด"
j_random_hacker

2

อย่างน้อยที่สุดการย้ายใน Windows ก็เป็นเพียงคัดลอกและลบอัตโนมัติ ฉันเชื่อว่า mv ย้ายแต่ละไฟล์ทีละรายการซึ่งหมายความว่า ^ c-ing จะไม่สูญเสียไฟล์ใด ๆ คุณจะจบลงด้วยการแยกไฟล์ระหว่างสองแห่ง - ซึ่งแตกต่างจาก Windows Explorer ซึ่งจะยกเลิกการย้ายทุกอย่างเมื่อยกเลิก

วิธีแก้ปัญหาของฉันคือ: ไม่ต้องย้ายเว้นแต่ฉันแน่ใจว่าฉันต้องการย้าย


1

หากคุณกำลังใช้ ACL บนระบบไฟล์ต้นทาง แต่ไม่ใช่ที่ปลายทาง mv บน Linux จะคัดลอกต้นทางแล้ว - เนื่องจากไม่สามารถตั้งค่า ACL บนปลายทาง - หยุด ดังนั้นคุณจะมีไฟล์ทั้งสองด้าน ไม่มีสวิตช์ใน mv เพื่อป้องกันพฤติกรรมดังกล่าวดังนั้นในกรณีนี้ cp && rm จะดีกว่า

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