ทำไม mv จึงเร็วกว่า cp มาก ฉันจะกู้คืนจากคำสั่ง mv ที่ไม่ถูกต้องได้อย่างไร


17

ฉันลากและวางโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์หนึ่งโดยไม่ได้ตั้งใจใน FileZilla

~/big_folder
~/some_other_folder

โฟลเดอร์ที่ถูกย้ายมีขนาดใหญ่มาก มันมีไฟล์หลายแสนไฟล์ (node_modules, ไฟล์รูปภาพขนาดเล็ก, โฟลเดอร์จำนวนมาก)

สิ่งที่แปลกมากคือหลังจากที่ฉันปล่อยเมาส์การเคลื่อนไหวก็เสร็จสิ้น โฟลเดอร์ "big_folder" ถูกย้ายไปที่ "some_other_folder"

~/some_other_folder/big_folder

(ไม่มีbig_folderใน~/หลังจากที่ย้าย)

จากนั้นฉันก็ตระหนักถึงข้อผิดพลาดและลองย้ายกลับ แต่มันล้มเหลวทั้งใน FileZilla และเทอร์มินัล

จากนั้นฉันต้องcp -rคัดลอกไฟล์กลับเพราะมีรหัสฝั่งเซิร์ฟเวอร์ที่เข้าถึงไฟล์เหล่านั้น~/big_folder

และจะต้องรอตลอดไป ...

ฉันควรทำอย่างไรดี?

BTW นี่คือผลลัพธ์จาก FileZilla (เป็นความล้มเหลวในการเคลื่อนย้ายกลับ):

Status:       Renaming '/root/big_folder' to '/root/some_other_folder/big_folder'
Status:       /root/big_folder -> /root/some_other_folder/big_folder

Status:       Renaming '/root/some_other_folder/big_folder' to '/root/big_folder'
Command:  mv "big_folder" "/root/big_folder"
Error:          mv /root/some_other_folder/big_folder /root/big_folder: received failure with description 'Failure'

37
อาข้อความที่เป็นประโยชน์มากที่สุดreceived failure with description 'Failure'คือ
Captain Man

3
mv /root/some_other_folder/big_folder /root/big_folderไปที่ขั้วและประเภทในคำสั่ง คุณได้รับข้อความแสดงข้อผิดพลาดอะไร
ctrl-alt-delor

ฉันอาจจะไปกับcp -al
Nemo

1
mv vs cpคำถามของ OP ได้รับการแก้ไข แต่ฉันชอบที่จะได้ยินว่าทำไมเขาถึงสามารถย้ายโฟลเดอร์ในทิศทางเดียวได้ในทันที แต่ไม่ใช่ที่อื่น ๆ
user1717828

4
ด้วยเหตุผลเดียวกันกับที่ทำให้การย้ายหนังสือจากห้องหนึ่งไปอีกห้องหนึ่งเร็วกว่าการสร้างสำเนาของหนังสือ
David Richerby

คำตอบ:


63

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

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

การย้ายไดเร็กทอรีระหว่างระบบไฟล์จะเกี่ยวข้องกับการคัดลอกข้อมูลไปยังปลายทางและลบออกจากแหล่งที่มา ขั้นตอนนี้ใช้เวลานานพอสมควรในการคัดลอก (ทำซ้ำ) ข้อมูลภายในระบบไฟล์เดียว


หาก FileZilla ประสบความสำเร็จในการเปลี่ยนชื่อไดเรกทอรีจาก~/big_folderไป~/some_other_folder/big_folderแล้วฉันจะกลับว่าการใช้

mv ~/some_other_folder/big_folder ~/big_folder

... หลังจากตรวจสอบให้แน่ใจก่อนว่าไม่มีไดเรกทอรีที่เรียก~/big_folder(ถ้ามีการย้ายจะถูกย้ายbig_folderจากsome_other_folderใน~/big_folderไดเรกทอรีเป็นโฟลเดอร์ย่อย)


6
โอ้ ... นั่นคือเหตุผลที่ฉันเห็นคำว่า "การเปลี่ยนชื่อ" มากกว่า "ย้าย" ในผลลัพธ์หรือไม่
AGamePlayer

2
@AGamePlayer ใช่ถูกต้อง
Kusalananda

4
@AGamePlayer "Failure" ไม่ใช่คำอธิบายข้อผิดพลาดที่ดี ฉันจะใช้mv ~/some_other_folder/big_folder ~/หลังจากทำให้แน่ใจว่าไม่มีbig_folderไดเรกทอรีอื่นในโฮม ฉันไม่เคยใช้ FileZilla
Kusalananda

10
อีกเหตุผลหนึ่งที่ไม่ขึ้นอยู่กับเครื่องมือ Windows GUI เพื่อทำการบำรุงรักษาไฟล์บน Unix
Mark Stewart

4
@ MarkStewart ทำไม“ on Unix” ในตอนท้ายของความคิดเห็นของคุณ? มีเวลาไหมที่เป็นความคิดที่ดี?
ctrl-alt-delor

11

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

open("hello1.txt", O_RDONLY)               = 3
open("hello2.txt", O_WRONLY|O_CREAT, 0644) = 4
read(3, "Hello, world!\n", 4096)           = 14
write(4, "Hello, world!\n", 14)            = 14
close(3)                                   = 0
close(4)                                   = 0

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

rename("hello1.txt", "hello2.txt")         = 0

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


OP ย้ายไดเรกทอรีไม่ใช่ไฟล์
อัล

มันยังคงใช้สรรพสินค้าใหญ่เว้นแต่ OP จะย้ายโฟลเดอร์ว่างซึ่งจะเป็นกรณีเดียวที่ไม่มีแฟ้มที่มีส่วนร่วม
แช่อิ่ม

@AL ในระบบเหมือน Unix ทุกอย่างเป็นไฟล์
Thegs

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