อะไรคือเหตุผลที่ทำให้ rmdir (1) และ rm (1) อยู่ร่วมกัน?


17

ฉันใช้ BSD และ Linux ทุกวันฉันไม่เคยมีสถานการณ์ที่ฉันต้องใช้ rmdir (1) มากกว่า rm (1) จุดประสงค์ของการดำรงอยู่ของ rmdir คืออะไร?


2
OT แต่ FWIW นี้แสดงการใช้งานที่น่าสนใจ (และแตกต่างกัน): cyberciti.biz/faq/linux-unix-remove-directory
pst

คำตอบ:


27

เหตุผลหลักน่าจะเป็นประวัติศาสตร์ ย้อนกลับไปในวันเก่า ๆ ไม่มีการเรียกrmdir(2)และmkdir(2)ระบบ (เรากำลังพูดถึง 7th Edition UNIX ™ที่นี่) และrmdir(1)(จำเป็น) โปรแกรมรูท SUID ที่ใช้การunlink(2)เรียกระบบเพื่อลบไดเรกทอรี

คู่มือ UNIX ฉบับที่ 7 มีให้ทางออนไลน์ที่http://cm.bell-labs.com/7thEdMan (ตรวจสอบล่าสุด 2017-04-23); พวกเขายังมีให้ที่http://plan9.bell-labs.com/7thEdMan (ตรวจสอบล่าสุด 2017-04-23) ดูเหมือนว่าจะมีแหล่งข้อมูลทางออนไลน์อย่างน้อยหนึ่งแหล่ง - http://wolfram.schneider.org/bsd/7thEdManVol2/ - สำหรับบทความในเล่มที่ 2 พร้อมลิงค์ไปยังไซต์FreeBSDสำหรับคำสั่งและการเรียกระบบในเล่ม 1 .

rmคำสั่ง (โปรแกรมที่ไม่ใช่ SUID ปกติ) อุทธรณ์rmdir(1)คำสั่งที่จะลบไดเรกทอรีว่าง มันทำเองไม่ได้ ที่ต้องใช้สิทธิ์รูท ดังนั้นrmdir(1)คำสั่ง (ดูที่นี่สำหรับซอร์สโค้ดใน Unix V7) มีอยู่เพื่อลบไดเร็กทอรีว่างและrmคำสั่งไม่ได้ลบไดเร็กทอรีว่างเอง

หากต้องการใช้rmเพื่อลบไดเรกทอรีคุณต้องให้-rตัวเลือก

นอกจากนี้ยังมีข้อโต้แย้งสมมาตร คุณต้องการคำสั่งmkdir(1)เพื่อสร้างไดเรกทอรี ดูเหมือนว่าสมเหตุสมผลที่จะมีคำสั่งrmdir(1)ให้ยกเลิกสิ่งที่mkdir(1)ทำ นอกจากนี้พวกเขายังเป็นผู้ฝึกหัดอย่างง่ายของการเรียกrmdir(2)และmkdir(2)ระบบ - ใช่, ย้อนกลับไปใน 7th Edition UNIX, mkdir(1)ยังเป็นโปรแกรมรูท SUID โดยใช้การmknod(2)เรียกเพื่อสร้างโหนดไดเรกทอรีและการlink(2)เรียกเพื่อสร้าง.และ..รายการในไดเรกทอรี .


AHA! ทั้งหมดนี้สมเหตุสมผลดี!

2
ดี ฉันเพิ่งตรวจสอบสำเนาของ 3BSD ที่ฉันมีที่นี่และไม่มีเอกสารสำหรับ rmdir syscall ที่นั่นและ rmdir (1) ยังคงใช้งานโดยยกเลิกการเชื่อมโยง
Andy Ross

4
ข้อเสียที่สำคัญอย่างหนึ่งของการเชื่อมโยง mknod + และระบบยกเลิกการเชื่อมโยงคือการสร้างไดเรกทอรีไม่ใช่การดำเนินการแบบอะตอมมิกดังนั้นคุณจึงสามารถจบลงด้วยไดเรกทอรีที่สมบูรณ์บางส่วน มีโปรแกรมมากมายที่คิดค้นขึ้นเพื่อตรวจสอบระบบไฟล์ว่ามีความไม่สอดคล้องกันเกิดขึ้นหรือไม่ fsck(1)เป็นคนที่รอดชีวิต
Jonathan Leffler

@ โจนาธานนำความทรงจำของ Xenix กลับมาอีกครั้ง yuck! ใช่สิ่งเลวร้ายจริงๆอาจเกิดขึ้นได้
Fiasco Labs

6

"rm" ไม่ทำงานในไดเรกทอรี คุณต้องใช้ rmdir หรือระบุสวิตช์ -r สำหรับการลบแบบเรียกซ้ำ เหตุผลนั้นเป็นเรื่องในอดีต: unlinkและrmdirเป็นการเรียกใช้ระบบแยกต่างหากและมาจากยุคแรก ๆ ของ Unix


4
ผลข้างเคียงที่มีความสุขคือคุณมีโอกาสน้อยที่จะลบไดเรกทอรีโดยไม่ตั้งใจเมื่อคุณตั้งใจจะลบเฉพาะไฟล์

ขอขอบคุณ. ฉันสังเกตเห็นว่า "rm -r" และ "rmdir" มีจำนวนจังหวะที่เท่ากัน rmdir มีอยู่จริงหรือไม่เพราะเหตุผลทางประวัติศาสตร์ (.. เข้ากันได้กับโปรแกรม Unix รุ่นเก่ามาหลายสิบปี) หรือไม่?

2
ที่จริงแล้วกลับมาในวันแรกของระบบปฏิบัติการยูนิกซ์ค่าrmdir(2)มิได้mkdir(2)ดำรงอยู่เป็นสายระบบ ผู้ใช้rootสามารถใช้การmknod(2)เรียกเพื่อสร้างโหนดไดเรกทอรีและการlink(2)โทรเพื่อสร้าง.และ..รายการในไดเรกทอรี และrootสามารถใช้การunlink(2)โทรเพื่อลบรายการไดเรกทอรี
Jonathan Leffler

3

นอกจากนี้ rmdir จะลบเท่านั้น ไดเรกทอรีที่ว่างเปล่า หากคุณต้องการให้แน่ใจว่าคุณไม่ได้ลบไฟล์เพิ่มเติมใด ๆ ในไดเรกทอรีrmdirมีความปลอดภัยมากกว่าrm -r(ยกเว้นถ้าคุณใช้นามแฝง RM คุณต้องยืนยันสิ่งที่คุณลบเสมอเช่นalias rm='rm -i'ใน ~ / .bashrc หรืออะไรก็ตามที่คุณใช้ )


1

นอกจากนี้ยังrmdirทำให้ง่ายต่อการลบไดเรกทอรีว่างด้วยนิพจน์ globbing (wildcard) ตัวอย่างเช่นหากต้องการลบไดเรกทอรีว่างทั้งหมด/tmpโดยไม่ต้องแตะไฟล์หรือไดเรกทอรีใด ๆ ที่มีเนื้อหา:

cd /tmp ; rmdir *

rmdir /tmp/*พิจารณาใช้ หาก/tmpไดเรกทอรีมีขนาดใหญ่มากอาจทำให้พื้นที่สำหรับการขัดแย้งเร็วขึ้นเล็กน้อยเนื่องจากมีอักขระเกินห้าตัวต่อชื่อ แต่มันไม่ต้องการให้cdคุณย้ายไปตามลำดับชั้นของไดเรกทอรี นอกจากนี้ยังควรพิจารณาrmdir /tmp/* 2>/dev/nullเพื่อหลีกเลี่ยงการเห็นข้อความแสดงข้อผิดพลาด (โดยทั่วไปจะมีจำนวนมากและเกือบทั้งหมดจะไม่เกี่ยวข้องกับงานในมือ)
Jonathan Leffler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.