จะเกิดอะไรขึ้นถ้า mv ถูกขัดจังหวะ?


71

จะเกิดอะไรขึ้นถ้าmvคำสั่งLinux ถูกขัดจังหวะ? บอกว่าฉันจะย้ายไดเรกทอรีทั้งหมดไปที่อื่นและขัดจังหวะมันในขณะที่มันย้าย ไดเรกทอรีต้นฉบับจะยังคงไม่ถูกแตะต้องหรือไม่?

คำตอบ:


49

หากคุณย้ายไดเร็กทอรีบนระบบไฟล์เดียวกันคุณจะย้ายรายการไดเร็กทอรีจากที่เดียวในระบบไฟล์ไปยังที่อื่น เช่นmv /source/dir /target/dirจะลบรายการไดเรกทอรีของdirจากและสร้างขึ้นมาใหม่ใน/source /targetทำได้โดยการเรียกระบบปรมาณูเพียงครั้งเดียว (กล่าวคือไม่หยุดชะงัก) inode ที่มีรายการไดเร็กทอรีdirรวมถึงเนื้อหาจริงของไดเร็กทอรีเองจะไม่ได้รับผลกระทบ

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


6
@Wesley: ไม่จะไม่มีไฟล์บางส่วน หากระบบยังคงอยู่ (เช่นคุณกด ctrl-C) ระบบจะถูกลบโดยอัตโนมัติ หากไม่ใช่ (เช่นการสูญเสียพลังงาน) ไฟล์บางส่วนอาจถูกทิ้งไว้ที่ไหนสักแห่งที่ไม่สามารถเข้าถึงได้บนดิสก์ปลายทาง แต่ควรจะล้างข้อมูลในครั้งต่อไปfsck(ซึ่งน่าจะทำงานโดยอัตโนมัติเมื่อรีบูต
Dave Sherohman

50
ไม่ถูกต้อง. หากคุณย้าย dir จาก fs หนึ่งไปยังอีก mv / fs1 / dir / fs2 / และคุณขัดจังหวะ / fs1 / dir / จะอยู่ที่นี่อย่างสมบูรณ์ / fs1 / dir จะถูกลบออกเฉพาะเมื่อการย้ายเสร็จสมบูรณ์

8
user263131 ถูกต้อง เรียกใช้strace mv /fs1/dir /fs2/- สิ่งสุดท้ายที่ mv ทำคือเรียกunlinkatใช้ไฟล์ต้นฉบับทั้งหมดพร้อมกัน (ไม่ใช่ทีละไฟล์ตามที่ถูกคัดลอก)
Jakob

7
@JJ ดูเหมือนว่าเป็นเพราะคุณใช้การขยาย bash ซึ่งในกรณีนี้ mv จะถือว่าไฟล์แต่ละไฟล์ในการขยายเป็นแหล่งที่แยกต่างหาก
gkanwar

5
ดังนั้น .... @bmk หรือคนอื่น ๆ คุณต้องการอัปเดตคำตอบนี้ให้น้อยลงหรือไม่?
Artem Russakovskii

35

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

mv a b c/

จะลบaก่อนการคัดลอกbและจะไม่เริ่มลบสิ่งใดในaก่อนที่การคัดลอกปลายทางจะเสร็จสิ้น

โปรดทราบว่าสิ่งนี้ใช้กับการนำไปใช้ของ GNU เท่านั้น

หากต้องการชี้แจง:หากaคือไดเร็กทอรีที่มีdและeและbเป็นไฟล์ลำดับจะเป็น

  • สร้าง c / a
  • คัดลอก a / d -> c / a / d
  • คัดลอก / e -> c / a / e
  • ลบ a / d
  • ลบ / e
  • ลบ
  • คัดลอก b -> c / b
  • ลบ b

1
คุณสามารถระบุแหล่งที่มาสำหรับสิ่งนี้ได้หรือไม่? ผู้ตอบคนอื่น ๆ กำลังบอกว่าไฟล์ต้นฉบับจะถูกลบทันทีหลังจากที่มันถูกคัดลอกไปยัง fs อื่น (เช่นไม่ใช่ทั้งหมดที่คัดลอกแล้วถูกลบทั้งหมด)
jamesbtate

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

ฉันสังเกตเห็นพฤติกรรมที่อธิบายในคำตอบนี้ใน macOS นั่นคือด้วย BSD mvเช่นกันดังนั้นจึงไม่ใช่ GNU เท่านั้น
kirelagin

12

คุณย้ายหนึ่งไดเรกทอรีขัดจังหวะการย้ายและไดเรกทอรีเดิมจะยังคงอยู่:

$ 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" เพื่อตรวจสอบ

ดูเหมือนว่าคำตอบของไซม่อนนั้นถูกต้อง


9

คำตอบที่ยอมรับนั้นผิดเกี่ยวกับการย้ายระหว่างระบบไฟล์ - ความจริงที่ช่วยให้ฉันประสบปัญหาหลายครั้งแล้ว เมื่อย้ายไดเรกทอรีที่มีไดเรกทอรีย่อยจะไม่มีการลบไฟล์ในไดเรกทอรีย่อยก่อนที่จะคัดลอกไดเรกทอรีย่อยทั้งหมด นี่คือ btw ความหมายที่แท้จริงของ "วัตถุโดยวัตถุ" - ไดเรกทอรีย่อยเป็นวัตถุ (ไฟล์) และดังนั้นความสมบูรณ์ของมันจะต้องถูกเก็บรักษาไว้โดยการคัดลอกที่สมบูรณ์ที่ปลายทางก่อนที่จะสามารถลบสิ่งใด ๆ ได้ ดังนั้นคำตอบของไซม่อนดูเหมือนจะเป็นสิ่งที่ถูกต้อง


4

ไม่ mv ใช้งานวัตถุโดยวัตถุดังนั้นวัตถุที่ถูกประมวลผลแล้วจะถูกลบออกจากแหล่งที่มา


2

ไม่แน่นอน การเคลื่อนย้ายทำโดยวัตถุ ดังนั้นวัตถุที่ย้ายไปยังปลายทางจนถึงจุดขัดจังหวะจะไม่มีอยู่ในแหล่งที่มาอีกต่อไป

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

อย่างไรก็ตามคุณสามารถกู้คืน mv ด้วยคำสั่งเดียวกันและกระบวนการจะดำเนินการต่อ


2

หากคุณต้องการขัดจังหวะ mv เนื่องจากคุณต้องการยกเลิกการเชื่อมต่อจากเทอร์มินัลคุณสามารถส่งมันไปที่พื้นหลัง:

* press Ctrl+Z

# bg
# disown

1
นั่นเป็นประเด็นที่ดี แต่ไม่ตอบคำถามจริง
Julie Pelletier

1
@JuliePelletier แต่นั่นคือสิ่งที่ฉันกำลังค้นหาดังนั้นบางคนอาจสนใจที่จะทำสิ่งนี้
КурочкаРяба
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.