จะเกิดอะไรขึ้นถ้าmvคำสั่งLinux ถูกขัดจังหวะ? บอกว่าฉันจะย้ายไดเรกทอรีทั้งหมดไปที่อื่นและขัดจังหวะมันในขณะที่มันย้าย ไดเรกทอรีต้นฉบับจะยังคงไม่ถูกแตะต้องหรือไม่?
จะเกิดอะไรขึ้นถ้าmvคำสั่งLinux ถูกขัดจังหวะ? บอกว่าฉันจะย้ายไดเรกทอรีทั้งหมดไปที่อื่นและขัดจังหวะมันในขณะที่มันย้าย ไดเรกทอรีต้นฉบับจะยังคงไม่ถูกแตะต้องหรือไม่?
คำตอบ:
หากคุณย้ายไดเร็กทอรีบนระบบไฟล์เดียวกันคุณจะย้ายรายการไดเร็กทอรีจากที่เดียวในระบบไฟล์ไปยังที่อื่น เช่นmv /source/dir /target/dirจะลบรายการไดเรกทอรีของdirจากและสร้างขึ้นมาใหม่ใน/source /targetทำได้โดยการเรียกระบบปรมาณูเพียงครั้งเดียว (กล่าวคือไม่หยุดชะงัก) inode ที่มีรายการไดเร็กทอรีdirรวมถึงเนื้อหาจริงของไดเร็กทอรีเองจะไม่ได้รับผลกระทบ
หากคุณย้ายไดเร็กทอรีจากระบบไฟล์หนึ่งไปยังอีกระบบไฟล์ทั้งหมดจะถูกคัดลอกไปยังระบบไฟล์ใหม่ก่อนจากนั้นยกเลิกการลิงก์จากระบบดั้งเดิม ดังนั้นหากคุณขัดจังหวะmvในขณะที่กำลังคัดลอกคุณอาจท้ายที่สุดมีสองสำเนาของไฟล์บางไฟล์ - ที่ตำแหน่งเก่าและที่ใหม่
strace mv /fs1/dir /fs2/- สิ่งสุดท้ายที่ mv ทำคือเรียกunlinkatใช้ไฟล์ต้นฉบับทั้งหมดพร้อมกัน (ไม่ใช่ทีละไฟล์ตามที่ถูกคัดลอก)
การนำ GNU ไปใช้ซ้ำจะทำซ้ำอาร์กิวเมนต์บนบรรทัดคำสั่งพยายามเปลี่ยนชื่อก่อนและหากล้มเหลวให้คัดลอกซ้ำแล้วลบแหล่งที่มาซ้ำ ดังนั้น
mv a b c/
จะลบaก่อนการคัดลอกbและจะไม่เริ่มลบสิ่งใดในaก่อนที่การคัดลอกปลายทางจะเสร็จสิ้น
โปรดทราบว่าสิ่งนี้ใช้กับการนำไปใช้ของ GNU เท่านั้น
หากต้องการชี้แจง:หากaคือไดเร็กทอรีที่มีdและeและbเป็นไฟล์ลำดับจะเป็น
mvเช่นกันดังนั้นจึงไม่ใช่ GNU เท่านั้น
คุณย้ายหนึ่งไดเรกทอรีขัดจังหวะการย้ายและไดเรกทอรีเดิมจะยังคงอยู่:
$ mv a b/
หากคุณย้ายหลายไดเรกทอรีแต่ละไดเรกทอรีจะยังคงอยู่ในแหล่งที่มาหรือปลายทางทั้งนี้ขึ้นอยู่กับเมื่อคุณถูกขัดจังหวะ:
$ mv a b c/
ฉันจะได้คำตอบอย่างไร:
$ mv --version
mv (GNU coreutils) 8.21
$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals. If the copy fails, then the part
that was copied to the destination partition is removed. If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.
จากการทดสอบฉันคัดลอกโฟลเดอร์ขนาดใหญ่ไปยังไดเรกทอรี NFS ขัดจังหวะและจำนวนไฟล์ในโฟลเดอร์ซอร์สขนาดใหญ่ของฉันยังคงเดิมและเนื้อหาบางส่วนถูกทิ้งไว้ในไดเรกทอรี NFS ฉันใช้ "find. -type f | wc -l" เพื่อตรวจสอบ
ดูเหมือนว่าคำตอบของไซม่อนนั้นถูกต้อง
คำตอบที่ยอมรับนั้นผิดเกี่ยวกับการย้ายระหว่างระบบไฟล์ - ความจริงที่ช่วยให้ฉันประสบปัญหาหลายครั้งแล้ว เมื่อย้ายไดเรกทอรีที่มีไดเรกทอรีย่อยจะไม่มีการลบไฟล์ในไดเรกทอรีย่อยก่อนที่จะคัดลอกไดเรกทอรีย่อยทั้งหมด นี่คือ btw ความหมายที่แท้จริงของ "วัตถุโดยวัตถุ" - ไดเรกทอรีย่อยเป็นวัตถุ (ไฟล์) และดังนั้นความสมบูรณ์ของมันจะต้องถูกเก็บรักษาไว้โดยการคัดลอกที่สมบูรณ์ที่ปลายทางก่อนที่จะสามารถลบสิ่งใด ๆ ได้ ดังนั้นคำตอบของไซม่อนดูเหมือนจะเป็นสิ่งที่ถูกต้อง
ไม่ mv ใช้งานวัตถุโดยวัตถุดังนั้นวัตถุที่ถูกประมวลผลแล้วจะถูกลบออกจากแหล่งที่มา
ไม่แน่นอน การเคลื่อนย้ายทำโดยวัตถุ ดังนั้นวัตถุที่ย้ายไปยังปลายทางจนถึงจุดขัดจังหวะจะไม่มีอยู่ในแหล่งที่มาอีกต่อไป
หาก mv ถูกใช้สำหรับไฟล์ขนาดใหญ่ (ระหว่างไฟล์อื่น) และถูกขัดจังหวะแหล่งที่มาจะยังคงอยู่ ในเป้าหมายคุณจะเห็นไฟล์ที่ไม่สมบูรณ์จนถึงจุดหยุดชะงัก
อย่างไรก็ตามคุณสามารถกู้คืน mv ด้วยคำสั่งเดียวกันและกระบวนการจะดำเนินการต่อ
หากคุณต้องการขัดจังหวะ mv เนื่องจากคุณต้องการยกเลิกการเชื่อมต่อจากเทอร์มินัลคุณสามารถส่งมันไปที่พื้นหลัง:
* press Ctrl+Z
# bg
# disown
fsck(ซึ่งน่าจะทำงานโดยอัตโนมัติเมื่อรีบูต