ข้อแตกต่างระหว่าง unlink กับ rm คืออะไร?


64

ยกเลิกการเชื่อมโยงใด ๆ เร็วกว่า rm หรือไม่


9
"การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด (หรืออย่างน้อยที่สุด) ในการเขียนโปรแกรม" - Donald Knuth en.wikiquote.org/wiki/Donald_Knuth
chris

คำตอบ:


68

ทั้งสองเป็น wrapper ของฟังก์ชันพื้นฐานเดียวกันซึ่งเป็นการunlink()เรียกระบบ

เพื่อชั่งน้ำหนักความแตกต่างระหว่าง userland utilies

rm(1):

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

unlink(1):

  • ตรวจสุขภาพจิตให้น้อยลง
  • ไม่สามารถลบไดเรกทอรี
  • ไม่สามารถเรียกคืน
  • สามารถรับอาร์กิวเมนต์ได้ครั้งละหนึ่งรายการเท่านั้น
  • เอนกายเล็กน้อยสำหรับการโทรเพียงครั้งเดียวเนื่องจากความเรียบง่าย
  • ช้าลงเมื่อเทียบกับการให้rm(1)ข้อโต้แย้งหลายข้อ

คุณสามารถแสดงความแตกต่างด้วย:

$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'

$ touch $(seq 1 100)
$ time rm $(seq 1 100)

real    0m0.048s
user    0m0.004s
sys     0m0.008s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done

real    0m0.207s
user    0m0.044s
sys     0m0.112s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done

real    0m0.167s
user    0m0.048s
sys     0m0.120s

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

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

แก้ไข:

ขออภัยชี้แจงความแตกต่างระหว่างและunlink(1) unlink(2)ความหมายยังคงมีความแตกต่างระหว่างแพลตฟอร์ม


นั่นหมายความว่าในระบบไฟล์ยูนิกซ์ลบไดเรกทอรีและเรียกซ้ำไฟล์ทั้งหมดภายใต้มันจะเป็นการดำเนินการที่เป็นสัดส่วนกับจำนวนไฟล์ / dirs ที่มันบรรจุอยู่? จะเกิดอะไรขึ้นเมื่อฉันยกเลิกการลิงก์ไดเรกทอรีที่เป็นพาเรนต์ไปยัง dirs / files อื่น ๆ ? มันไม่เคยถูกกำจัดออกไปและฉันเสียพื้นที่นี้ไปตลอดกาล?
Marcin

6
มันเป็นไปได้ในทางเทคนิคที่จะทิ้งไดเรกทอรี / ไฟล์ orphaned ไว้ในระบบไฟล์ส่วนใหญ่ถ้าไม่ใช่ทุกระบบ การแก้ไขโดยทั่วไปหมายถึงการเรียกใช้เครื่องมือซ่อมแซมระบบไฟล์ บน Unix / Linux เครื่องมือเหล่านี้เรียกว่า 'fsck' และตัวแปรเฉพาะบางประการสำหรับระบบไฟล์ที่แตกต่างกัน หากพวกเขากู้คืนสิ่งที่พวกเขามักจะทิ้งไว้ในไดเรกทอรีที่เรียกว่า 'หายไป + พบ'
ConcernedOfTunbridgeWells

1
แก้ไข. rm จะหักเงินจากด้านล่างของต้นไม้ขึ้น mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1คุณสามารถแสดงให้เห็นว่าด้วย: หากคุณยกเลิกการเชื่อมโยงไดเรกทอรีหลักแล้วพื้นที่ที่เด็ก ๆ ใช้ควรจะหายไปจนกว่าจะถึงเวลาที่ fsck ค้นหาความแตกต่าง
Dan Carley

1
คุณกำลังพูดเรื่องอะไร $ mkdir -p 1/2/3 $ unlink 1 ยกเลิกการเชื่อมโยง: ไม่สามารถยกเลิกการเชื่อมโยง `1 ': เป็นไดเรกทอรีผู้ใช้ที่ทำให้" หน่วยความจำ "รั่วต้อง fsck หรือไม่ ไม่น่า!
Thomas

1
ทั้ง Linux และ FreeBSD manpages ระบุอย่างชัดเจนว่าจะล้มเหลวเมื่อพยายามรัน unlink () ในไดเรกทอรี
Thomas

8

ในระดับข้อมูลจำเพาะ POSIX สิ่งRMไม่ระบุไว้แน่นมากขึ้นกว่าสิ่งที่ยกเลิกการเชื่อมโยงไม่

ความสามารถในการพกพาของผลลัพธ์น่าจะใช้ rm ได้ดีกว่าถ้าสคริปต์ของคุณต้องทำงานข้ามระบบปฏิบัติการ


4

ส่วนที่ช้าของการลบคือรหัสระบบไฟล์และข้อมูลในดิสก์

เช่น: หากความเร็วแตกต่างกันคุณไม่ควรเก็บข้อมูลไว้ในระบบไฟล์

unlink เป็นเพียง "แสง" rm rm มีคุณสมบัติมากกว่าเดิม แต่ทำในสิ่งเดียวกัน

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