เหตุใดจึงเป็น rm -rf และไม่ใช่ rmdir -rf


13

rm -rfฉันได้รับเสมออยากรู้อยากเห็นว่าทำไมคำสั่งสำหรับทุกสิ่งที่ลบในไดเรกทอรีคือ

ทำไมไม่มีธงทำเช่นเดียวกันกับrmdir?

มันจะไม่ใช้งานง่ายกว่าrmdirสำหรับการดำเนินการไดเรกทอรีหรือไม่


9
rmdirลบไดเรกทอรีrmลบ เหตุใดจึงเป็นการง่ายสำหรับrmdirการลบไม่ใช่ไดเรกทอรี?
Stéphane Chazelas

5
เพราะมันไม่ใช่ คุณมีอายุ 40 ปีแล้วที่ถามคำถามนี้และคุณถามคนผิด
user207421

คำตอบ:


25

ในระบบไฟล์ Unix เริ่มต้น (อย่างน้อยย้อนกลับไปในไดเรกทอรี V7 วันประมาณปี 1970) ถูกนำมาใช้เป็นไฟล์พิเศษและมีเพียงรูทเท่านั้นที่สามารถใช้การmknod(2)เรียกระบบที่สร้างพวกเขาและรูทเท่านั้นที่สามารถunlink(2)เป็นไฟล์ไดเร็กทอรีพิเศษได้

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

ความสอดคล้องถูกดูแลรักษาโดยโปรแกรมพื้นที่ผู้ใช้เช่นmkdir(1)และrmdir(1)เป็นรูทของ Set-UID เพื่อให้สามารถทำการเรียกใช้ระบบที่มีสิทธิพิเศษในนามของผู้ใช้ที่ไม่มีสิทธิพิเศษ เมื่อเพิ่มการสอบถามซ้ำrm(1)คำสั่ง remove จะเรียกใช้เป็น UID ปัจจุบันจากนั้นเรียกใช้rmdir(1)เพียงเพื่อลบไดเรกทอรีว่างเปล่า นี่ยังคงเป็นวิธีมาตรฐานในการยกระดับสิทธิ์: อย่าใช้สิทธิ์มากกว่าที่คุณต้องการ

บางครั้งในภายหลังmkdir(2)และrmdir(2)ถูกเพิ่มเป็นสายระบบของตัวเอง แต่ความสัมพันธ์ระหว่างrm(1)และrmdir(1)ยังคงอยู่

โดยส่วนตัวแล้วฉันพบว่ามันน่าพึงพอใจมากกว่าrmdir junkและรู้ว่าสิ่งที่แย่ที่สุดที่ฉันทำคือลบไดเรกทอรีว่างเปล่าออก


1
Re ประโยคสุดท้าย: สันนิษฐานว่าหากการดำเนินการลบแบบเรียกซ้ำอยู่ในrmdirนั้นก็ยังคงต้องมีการ-rตั้งค่าสถานะ ( rmdir -r junkแทนrm -r junkและrmdir junkยังคงใช้ได้เฉพาะในกรณีที่ไดเรกทอรีว่างเปล่า)
user253751

7

มันเป็นประวัติศาสตร์ rmถูกสร้างขึ้นมาเพื่อลบการอ้างอิงไปยังไฟล์ที่จะลบไดเรกทอรีขนานไปกับrmdir mkdirเมื่อหลายปีก่อน Unix rmสามารถลบไดเรคทอรี่ได้ด้วยการเรียกใช้rmdirเท่านั้น นอกจากนี้ยังไม่ได้rmdir(2)โทรระบบเป็นโปรแกรมที่เรียกว่าrmdirunlink(2)

อ้างอิง:


2

เป็นเรื่องของความเห็นrmล้วนๆแต่จะลบไฟล์ในขณะที่rmdirลบไดเรกทอรี ไดเรกทอรีเป็นไฟล์ แต่เป็นไฟล์ชนิดพิเศษดังนั้นจึงเหมาะสมที่rmจะลบออก แต่ให้ปฏิบัติต่อพวกเขาเป็นพิเศษ (เช่นต้องใช้ตัวเลือกพิเศษเพื่อเปิดใช้งานความสามารถ) ในทางกลับกันไม่ใช่ไฟล์ทั้งหมดที่เป็นไดเรกทอรี และมันไม่มีเหตุผลที่ IMHO rmdirจะลบสิ่งที่ไม่ใช่ไดเรกทอรี


1
หากเป็นเช่นนั้นเหตุใดจึงไม่สามารถrmลบไดเรกทอรีว่างเปล่า (ยกเว้นในโหมดเรียกซ้ำ)
253751

เหตุผลเดียวกับที่มันไม่สามารถลบไดเรคทอรี่เต็มได้ - มันต้องใช้-rแฟล็กเพื่อเปิดใช้งานฟีเจอร์ของไฟล์พิเศษของไดเรกทอรี
ดาร์วินฟอน Corax

1
ให้เหตุผลแบบวงกลมที่นั่น ...
253751

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