ฉันใช้ BSD และ Linux ทุกวันฉันไม่เคยมีสถานการณ์ที่ฉันต้องใช้ rmdir (1) มากกว่า rm (1) จุดประสงค์ของการดำรงอยู่ของ rmdir คืออะไร?
ฉันใช้ BSD และ Linux ทุกวันฉันไม่เคยมีสถานการณ์ที่ฉันต้องใช้ rmdir (1) มากกว่า rm (1) จุดประสงค์ของการดำรงอยู่ของ rmdir คืออะไร?
คำตอบ:
เหตุผลหลักน่าจะเป็นประวัติศาสตร์ ย้อนกลับไปในวันเก่า ๆ ไม่มีการเรียก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)
เรียกเพื่อสร้าง.
และ..
รายการในไดเรกทอรี .
fsck(1)
เป็นคนที่รอดชีวิต
"rm" ไม่ทำงานในไดเรกทอรี คุณต้องใช้ rmdir หรือระบุสวิตช์ -r สำหรับการลบแบบเรียกซ้ำ เหตุผลนั้นเป็นเรื่องในอดีต: unlink
และrmdir
เป็นการเรียกใช้ระบบแยกต่างหากและมาจากยุคแรก ๆ ของ Unix
rmdir(2)
มิได้mkdir(2)
ดำรงอยู่เป็นสายระบบ ผู้ใช้root
สามารถใช้การmknod(2)
เรียกเพื่อสร้างโหนดไดเรกทอรีและการlink(2)
โทรเพื่อสร้าง.
และ..
รายการในไดเรกทอรี และroot
สามารถใช้การunlink(2)
โทรเพื่อลบรายการไดเรกทอรี
นอกจากนี้ rmdir จะลบเท่านั้น ไดเรกทอรีที่ว่างเปล่า หากคุณต้องการให้แน่ใจว่าคุณไม่ได้ลบไฟล์เพิ่มเติมใด ๆ ในไดเรกทอรีrmdir
มีความปลอดภัยมากกว่าrm -r
(ยกเว้นถ้าคุณใช้นามแฝง RM คุณต้องยืนยันสิ่งที่คุณลบเสมอเช่นalias rm='rm -i'
ใน ~ / .bashrc หรืออะไรก็ตามที่คุณใช้ )
นอกจากนี้ยังrmdir
ทำให้ง่ายต่อการลบไดเรกทอรีว่างด้วยนิพจน์ globbing (wildcard) ตัวอย่างเช่นหากต้องการลบไดเรกทอรีว่างทั้งหมด/tmp
โดยไม่ต้องแตะไฟล์หรือไดเรกทอรีใด ๆ ที่มีเนื้อหา:
cd /tmp ; rmdir *
rmdir /tmp/*
พิจารณาใช้ หาก/tmp
ไดเรกทอรีมีขนาดใหญ่มากอาจทำให้พื้นที่สำหรับการขัดแย้งเร็วขึ้นเล็กน้อยเนื่องจากมีอักขระเกินห้าตัวต่อชื่อ แต่มันไม่ต้องการให้cd
คุณย้ายไปตามลำดับชั้นของไดเรกทอรี นอกจากนี้ยังควรพิจารณาrmdir /tmp/* 2>/dev/null
เพื่อหลีกเลี่ยงการเห็นข้อความแสดงข้อผิดพลาด (โดยทั่วไปจะมีจำนวนมากและเกือบทั้งหมดจะไม่เกี่ยวข้องกับงานในมือ)