มีความแตกต่างระหว่าง mv และ {cp + rm ไฟล์เก่า} บน Unix หรือไม่?


14
  • mv a b

  • cp a b;rm a

นี่เป็นข้อความสองชุด มีความแตกต่างระหว่างสิ่งที่พวกเขาทำอย่างไร


1
atomicity? ฉันไม่รู้จริงๆว่าคำสั่ง mv นั้นเป็นอะตอมหรือไม่
Adriano Varoli Piazza

ใช่. คุณถามทำไม?

1
ตอนนี้mvคล้ายกับln+ rmแต่ก่อนหน้านี้จะทำงานสำหรับการย้ายระบบไฟล์ข้าม (ซึ่งเพิ่งจะกลายเป็นcp+ rm) ในขณะที่หลังจะล้มเหลวที่ln(ซึ่งไม่สนับสนุนการเชื่อมโยงฮาร์ดระบบไฟล์ข้าม)
Chris Jester-Young

ทุกวันเป็นวันโรงเรียน - สำหรับใครก็ตามที่สงสัยว่าจะแก้ไขพฤติกรรมเริ่มต้นนี้อย่างไรคุณต้องใช้--remove-destinationสวิตช์ - stackoverflow.com/a/9371263/409638
robert

คำตอบ:


20

สมมติว่าไฟล์ที่เกี่ยวข้องนั้นอยู่ในระบบไฟล์เดียวกัน mv จะเปลี่ยนพอยน์เตอร์ในระบบไฟล์ในขณะที่ cp จะคัดลอกเนื้อหาทั้งหมดของไฟล์และ rm จะเปลี่ยนพอยน์เตอร์อีกครั้ง mv จึงมีประสิทธิภาพมากกว่า


1
แต่พวกเขาทำสิ่งเดียวกันแน่นอนใช่ไหม
Lazer

8
ไม่พวกเขาทำไม่ได้

3
@eSKay: ไม่สองสถานการณ์: 1. ไม่มีเป้าหมาย mvเพียงเปลี่ยนชื่อไฟล์ (inode เดียวกับไฟล์ต้นฉบับ) cpทำให้ inode ใหม่สำหรับไฟล์ใหม่ 2. มีเป้าหมายอยู่ mvunlinks (ลบ) ไฟล์เป้าหมายและเปลี่ยนชื่อในขั้นตอนเดียว cpเขียนทับ inode ของไฟล์เป้าหมาย
Chris Jester-Young

7
นอกจากนี้ยังmvไม่เคยเปลี่ยนแปลงได้รับอนุญาตหรือความเป็นเจ้าของ ลองนึกภาพคุณต้องการย้ายไฟล์จาก homedir ของเพื่อนคุณไปยัง homedir ของคุณเอง หากคุณmvคุณจะจบลงด้วยไฟล์ใน homedir ของคุณที่เป็นของเพื่อนของคุณ คุณไม่สามารถchownหรือchmodขึ้นอยู่กับสิทธิ์ที่ไม่ได้แก้ไขหรืออ่าน หากคุณcpตามด้วยrmไฟล์จะเป็นของคุณและทุกอย่างเรียบร้อย
ลุดวิก Weinzierl

9

ใช่ mv มีโอกาสเป็นอะตอมบนดิสก์เดียวกันในขณะที่การรวมกันของ cp และ rm ไม่เคยมี

นี่คือการสมมติว่า mv ถูกนำไปใช้โดยใช้rename()ซึ่งเป็นการเรียกที่มีการรับประกัน ดูตัวอย่างเช่นโพสต์กลุ่มข่าวนี้ซึ่งเสนอราคา POSIX:

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


8

ในระบบไฟล์เดียวกัน mv เปลี่ยนการอ้างอิงไดเรกทอรีชี้ไปที่ไอโหนดเดียวกัน (ข้อมูลไฟล์และข้อมูลเมตา) ดังนี้:

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

คัดลอกและลบ

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

4

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

cp& rmจะต้องโหลด / จัดเก็บข้อมูลทั้งหมดแม้ว่าจะไม่จำเป็นก็ตาม


3

mvอยู่ในสาระสำคัญการดำเนินการ "เปลี่ยนชื่อ" นี่หมายความว่าไฟล์นั้นอยู่ในจุดเดียวกันบนดิสก์ ไม่มีการดำเนินการไฟล์จริง


3

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

หากต้องการแทนที่ค่าเริ่มต้นนี้ให้ใช้ "cp -p" เพื่อรักษาการแก้ไขข้อมูลล่าสุดเวลาของการเข้าถึงครั้งล่าสุด ID ผู้ใช้และ ID กลุ่ม (เฉพาะเมื่อมีการอนุญาตให้ทำ) บิตสิทธิ์การใช้ไฟล์และ SUID และ SGID เกร็ด


2

ใช่.

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


2

cp และ rm นั้นหนักกว่าการใช้งานดิสก์มากและอาจล้มเหลวด้วยเหตุผลของพื้นที่ดิสก์

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