ทำไมฉันไม่สามารถลบ '.' ไดเรกทอรี?


40

ฉันพยายามลบ '.' ไดเรกทอรี ฉันคิดว่าฉันสามารถลบไดเรกทอรีการทำงานของฉันได้โดยไม่ต้องไปที่ไดเรกทอรีหลัก

ประเด็นคำถามของฉันคือการค้นหาข้อมูลเชิงลึกเกี่ยวกับวิธีที่ระบบ linux ทำงานเพื่อลบไฟล์


1
ลอง rm -r 'pwd' เพื่อลบ dir ปัจจุบันโดยไม่ย้ายไปเป็น parent dir
faadi

7
คำถามนี้ไม่ซ้ำกัน คำถามนั้นถามว่าเพราะเหตุใดฮาร์ดไดรฟ์จึงมีอยู่ในลักษณะเป็นนิติบุคคลแทนที่จะถูกสังเคราะห์ คำถามนี้ถามไม่เพียง แต่สาเหตุrm .และrmdir .ไม่ทำงาน แต่ทำไมพวกเขาถึงระบุว่าไม่ทำงานซึ่งไม่ขึ้นอยู่กับการมีอยู่จริงของฮาร์ดลิงก์
JdeBP

9
รูปภาพที่คุณปีนขึ้นไปบนต้นไม้เพื่อตัดกิ่งไม้ คุณนั่งด้านใดของการตัดเมื่อคุณเริ่มเห็น (นั่นคือระบบไฟล์ลินุกซ์สั้น.)
ไมเคิล

7
ลองนึกภาพทำrm -rf .*เพียงเพื่อค้นหาสิ่งนี้รวมถึงไม่เพียง.แต่ยัง..และจาก../..นั้นแล้ว ...
gerrit

คำตอบ:


89

การลบไดเร็กทอรีปัจจุบันไม่ส่งผลต่อความสมบูรณ์ของระบบไฟล์หรือองค์กรโลจิคัล การป้องกันการ.ลบถูกทำเพื่อทำตามมาตรฐาน POSIX ซึ่งระบุไว้ในrmdir(2)หน้าคู่มือ:

หากอาร์กิวเมนต์ของพา ธ อ้างถึงพา ธ ที่มีองค์ประกอบสุดท้ายคือ dot หรือ dot-dot rmdir () จะล้มเหลว

เหตุผลหนึ่งสามารถพบได้ในrmหน้าคู่มือ:

ยูทิลิตี้ rm เป็นสิ่งต้องห้ามในการลบชื่อจุดและจุดจุดเพื่อหลีกเลี่ยงผลที่ตามมาของการทำบางสิ่งเช่น:

rm -r. *

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

โปรดทราบว่ากระบวนการจะไม่สามารถใช้พา ธ ที่สัมพันธ์กับไดเรกทอรีปัจจุบันเพื่อเปลี่ยน cwd (เช่นcd ..) เนื่องจากไม่มี..รายการในไดเรกทอรีปัจจุบันอีกต่อไป

เมื่อชนิดคนที่rmdir .พวกเขามีแนวโน้มคาดว่ารายการไดเรกทอรีปัจจุบันจะถูกลบออก แต่เมื่อไดเรกทอรีจะถูกลบออก (โดยใช้เส้นทางของมัน) สามรายการไดเรกทอรีจะถูกลบออกจริง., ..และไดเรกทอรีของตัวเอง

การลบออกเท่านั้น.และไม่ใช่รายการไดเรกทอรีของไดเรกทอรีนี้จะสร้างไดเรกทอรีที่ไม่สอดคล้อง แต่ตามที่ระบุไว้แล้วมันเป็นสิ่งต้องห้ามโดยมาตรฐาน

ดังที่ @Emmanuel ชี้ให้เห็นอย่างถูกต้องมีเหตุผลที่สองว่าทำไม.ไม่อนุญาตให้นำออก มีอย่างน้อยหนึ่ง POSIX ที่รองรับ OS (Mac OS X ที่มี HFS +) ที่มีข้อ จำกัด ที่แข็งแกร่งสนับสนุนการสร้างลิงก์ไปยังไดเรกทอรีที่มีอยู่ ในกรณีเช่นนี้ไม่มีวิธีที่ชัดเจนจากภายในไดเรกทอรีที่จะทราบว่าฮาร์ดลิงก์ใดที่เป็นสิ่งที่คาดว่าจะถูกลบออก


9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "ความหมายของการลบชื่อพา ธ / จุดไม่ชัดเจนเนื่องจากชื่อไฟล์ (ไดเรกทอรี) ในไดเรกทอรีหลักที่จะลบไม่ชัดเจนโดยเฉพาะในสถานะปัจจุบัน ลิงก์หลายอันไปยังไดเรกทอรี "
Emmanuel

@Emmanuel การลบไดเรกทอรีที่มีมากกว่าสองลิงก์ (เช่นไม่ว่าง) ถูกห้ามโดยการออกแบบ (ไม่ใช่ไดเรกทอรีว่าง) ไดเร็กทอรีที่มีจำนวนลิงก์หนึ่งรายการถูกห้ามโดยมาตรฐาน (อย่างน้อยกับระบบไฟล์ที่จำนวนลิงก์มีความหมาย)
jlliagre

3
@jlliagre: ไม่ใช่คำถามของไดเรกทอรีที่มีลิงค์หลายอัน แต่เป็นไดเรกทอรีที่มีลิงค์หลายลิงค์ ระบบไฟล์และ / หรือระบบปฏิบัติการบางระบบไม่อนุญาตสิ่งนี้ แต่ไม่ทั้งหมด
Jörg W Mittag

@ JörgWMittagไดเรกทอรีที่มีหลายไดเรกทอรีมีหลายลิงค์ตามการออกแบบเพราะทุกไดเรกทอรีย่อย..เชื่อมโยงไปยังมัน นี่เป็นกรณีที่ไม่ซ้ำกันlink count > 2ของระบบปฏิบัติการและระบบไฟล์ส่วนใหญ่ดังนั้น "ระบบไฟล์บางระบบและ / หรือระบบปฏิบัติการ" จึงเป็นสิ่งที่ไม่เพียงพอ ข้อยกเว้นที่ไม่รู้จักในอดีตเท่านั้นคือ Mac OS X ที่มี HFS + ซึ่งเพิ่มข้อ จำกัด เกี่ยวกับบุคคลและสิ่งที่สามารถทำได้ ได้รับความคิดเห็น POSIX ถูกนำไปที่แปลกนี้ ดูunix.stackexchange.com/questions/22394/…
jlliagre

เฮ้ฉันเคยทำrm -r .*มาก่อนและมันจะพัดพาทุกสิ่งทุกอย่างภายใต้ไดเรกทอรีแม่ซ้ำซาก ... นั่นเป็นเวลากว่าหนึ่งทศวรรษหรือสองปีที่แล้ว แต่ก็ดีที่รู้ว่าrmไม่อนุญาตสิ่งนี้อีกต่อไป
antak

9

มันทำเช่นนั้นเพื่อความซื่อสัตย์เนื่องจากคุณอยู่ในไดเรกทอรีนั้นและ.เป็นเพียงการอ้างอิงตนเอง

คุณต้องไปในพาเรนต์หรือการโทรrmdirด้วยพา ธ ซึ่งสามารถทำได้ด้วย:

rmdir `pwd`

หากคุณต้องการสิ่งนี้บ่อยๆคุณสามารถตั้งชื่อแทนได้เช่น:

alias rmc='rmdir `pwd`'

.. ซึ่งอาจเรียกได้ว่าเป็นrmcคนเดียวที่จะลบไดเรกทอรีปัจจุบัน


13
แต่ทำไม / อย่างไรrmdir .คำสั่งสมมุติฐานทำให้ความสมบูรณ์ของระบบไฟล์แตกต่างกันในทางที่rmdir $(pwd)หรือrmdir "$PWD"ไม่?
G-Man กล่าวว่า 'Reinstate Monica'

4
มันไม่ได้เป็นเรื่องของความซื่อสัตย์สุจริต FS แต่เป็นองค์กรตรรกะ เมื่อคุณเลือกไดเรกทอรีปัจจุบันของคุณคุณบอกให้เชลล์ใช้ไดเรกทอรีนี้สำหรับการดำเนินการที่จะเกิดขึ้น แต่คุณไม่สามารถลบบางสิ่งออกจากตัวเองได้
Julie Pelletier

7
ฉันเกรงว่ามันจะเป็นการคาดเดา
Emmanuel

4
@ FrankankPiat ฉันไม่พบความคิดเห็นของคุณเป็นประโยชน์อย่างยิ่ง: 1. OP ใช้ไปที่ไหนrm *และคุณหมายถึงอะไรจากประวัติเชลล์? 2. คำตอบตอบคำถามทำไมส่วน 3. สนใจที่จะทำอย่างละเอียด?
JBentley

4
@ G-Man ถ้าคุณทำrmdir $(pwd), pwdตัวเลขออกมาเป็นชื่อตรรกะสำหรับไดเรกทอรีปัจจุบันตัวอย่าง/foo/bar/bazแล้วrmdirเห็นเส้นทางที่เอาbazรายการจาก/foo/barไดเรกทอรีให้ตรงตามเงื่อนไข มันสมเหตุสมผลแล้ว คำสั่งrmdir .บนมืออื่น ๆ ที่เป็นคำสั่งที่จะลบ.รายการจากไดเรกทอรีปัจจุบันซึ่งได้รับอนุญาตค่า (มันจะละเมิดข้อ จำกัด ว่าไดเรกทอรีทุกคนมี.ชี้เข้ากับตัวเอง) หรือที่มีประโยชน์ (มันจะไม่ลบการเชื่อมโยง คุณต้องการลบออก)
ฮอบส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.