ทำไมการเรียกซ้ำไม่ขึ้นไปด้วย rm


13

ฉันสงสัยเกี่ยวกับทิศทางของการเรียกซ้ำโดยทั่วไปและ RM โดยเฉพาะ

การเรียกซ้ำ rm ทำงานได้ถูกต้องหรือไม่

วิ่ง: sudo rm -R *.QTFSจะลบไฟล์ * .QTFS ทั้งหมดในไดเรกทอรีปัจจุบันและลูก ๆ ของมันถูกต้องไหม?

ไดเรกทอรีปัจจุบันที่แสดงโดยls -lhaยังมี.และ..ลิงก์สำหรับการขาดคำที่ดีกว่าดังนั้นทำไมการเรียกซ้ำไม่ทำตามสิ่งเหล่านี้ขึ้นในแผนผังไดเรกทอรี? มีการ จำกัด สิทธิ์ในแอป rm หรือไม่.และ..ไม่ใช่ของจริง?


5
เพราะรากและความบ้าคลั่งวิธีการโกหก ...
jasonwryan


1
สำหรับเกร็ดเล็กเกร็ดน้อยที่น่าสนใจ ... ฉันวิ่ง rm -rf ในไดเรกทอรีย่อยที่ดูไร้เดียงสา ณ จุดหนึ่งเท่านั้นเพื่อค้นหาสิ่งที่น่ากลัวของฉันที่ผู้ใช้มีสิ่งที่เชื่อมโยงอย่างหนักในที่นั่นจนถึงต้นน้ำที่สำคัญมาก ใช่ฉันมีการสำรองข้อมูลปัจจุบันและไม่มีข้อมูลสูญหาย แต่ให้เป็นเรื่องเตือน ... :-)
Brian Knoblauch

@BrianKnoblauch สิ่งที่เป็นอันตรายสามารถทำได้โดยการลบลิงค์ยาก? ฉันไม่เข้าใจประเด็นของคุณ ...
Alexey

@Alexey ประเด็นก็คือว่าฮาร์ดลิงก์นั้นไม่ได้ถูกลบออก มัน recursed ลงในไดเรกทอรีที่เชื่อมโยงอย่างหนักซึ่งถูกเชื่อมโยงไปยังจุดที่สูงขึ้นในระบบแฟ้มดังนั้นเริ่มกินข้อมูลของทุกคน ...
Brian Knoblauch

คำตอบ:


18

rm การเรียกซ้ำใช้งานได้ถูกต้องหรือไม่

rm -r x yจะลบxและyทุกอย่างภายในตัวพวกเขา (ถ้าพวกเขาเป็นไดเรกทอรี) แต่ไม่ใช่พ่อแม่ของพวกเขาหรืออะไรก็ตามที่อยู่ข้างนอก

วิ่ง: sudo rm -R *.QTFSจะลบไฟล์ * .QTFS ทั้งหมดในไดเรกทอรีปัจจุบันและลูก ๆ ของมันถูกต้องไหม?

ไม่มันจะลบไฟล์ทั้งหมดที่มีชื่อไฟล์*.QTFSใด ๆ ที่เรียกซ้ำภายในไดเรกทอรีที่เรียกว่า*.QTFSและไดเรกทอรีเหล่านั้นด้วยตนเอง หากคุณต้องการว่าพฤติกรรมการลบอื่น ๆ find -deleteการใช้งาน

ไดเรกทอรีปัจจุบันที่แสดงโดยls -lhaยังมี.และ..ลิงก์สำหรับการขาดคำที่ดีกว่าดังนั้นทำไมการเรียกซ้ำไม่ทำตามสิ่งเหล่านี้ขึ้นในแผนผังไดเรกทอรี? มีการ จำกัด สิทธิ์ในแอป rm หรือไม่.และ..ไม่ใช่ของจริง?

มันเป็นขีด จำกัด rmของเทียม

มันไม่ใช่สิ่งที่ประดิษฐ์ขึ้นมาทั้งหมด - มันเป็นวิธีเดียวที่จะทำงานได้ ถ้าrmตามผู้ปกครอง..การเชื่อมโยงทุกrm -rจะลบไฟล์บนทุกระบบโดยทำตามทั้งหมดของการเชื่อมโยงทั้งหมดทางกลับไป.. เห็นและรายการในแต่ละไดเรกทอรีเมื่อรายการเนื้อหาและไม่สนใจพวกเขาอย่างชัดเจนด้วยเหตุผลดังกล่าว/rm...

คุณสามารถลองด้วยตัวเองในความเป็นจริง เรียกใช้rm -r .และrmการใช้งานส่วนใหญ่จะปฏิเสธที่จะทำหน้าที่รายงานข้อผิดพลาดอย่างชัดเจน:

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(ข้อความนั้นมาจาก GNUrm ; คนอื่นคล้ายกัน) เมื่อพบรายการเหล่านี้โดยปริยายแทนที่จะเป็นข้อโต้แย้งที่ชัดเจนก็เพียงละเว้นพวกเขาและดำเนินการต่อ พฤติกรรมที่ถูกต้องตาม POSIX ใน GNU rmและ BSD จำนวนมากมันถูกจัดเตรียมโดยอัตโนมัติโดยกลุ่มfts_readฟังก์ชันลำดับชั้น - การข้ามผ่าน

หรือ.และ..ไม่ใช่ของจริง?

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


สำหรับใครที่กำลังมองหาหลักฐาน (หรือเพียงธรรมดาสนใจ) จะดูที่วิธีการนี้จะดำเนินการใน coreutils
Chris Hayes

@ChrisHayes ลิงค์ gitweb ที่เทียบเท่านั้นอยู่ในคำตอบ กรณีเรียกซ้ำที่เกิดขึ้นจริงนั้นอยู่ในระหว่างfts_readการนำไปใช้งานซึ่งเป็นกรณีสำหรับอาร์กิวเมนต์บรรทัดคำสั่งเท่านั้น
Michael Homer

@MichaelHomer โอ้ว้าวดังนั้นมันจึงเป็น สีของลิงก์นั้นไม่โดดเด่นในโครงร่าง SE นี้ ความผิดพลาดของฉัน.
Chris Hayes

2
คำตอบนี้ถูกต้อง แต่ยังไม่แน่ชัด rmไม่เห็นด้วยซ้ำ*.QTFSเพราะมันจะขยายไปยังชื่อไฟล์โดยการทุบตีก่อนที่จะเรียกใช้ไบนารี rm @ tobyink คำตอบของบันทึกย่อที่
Daenyth

ในฐานะที่เป็น sidenote พฤติกรรมเหล่านี้.และ..กรณีพิเศษถูกกล่าวว่าเป็นสาเหตุของการดำรงอยู่ของ dotfiles
mgarciaisaia

5

สิ่งที่ไมเคิลโฮเมอร์เขียนนั้นมีปัจจัยอีกประการหนึ่งที่ทำให้ยากที่จะหักค่าใช้จ่ายเข้าไปในไดเรกทอรีแม่

ไปที่โฮมไดเร็กตอรี่ของคุณแล้วพิมพ์ดังนี้:

echo *s*

คุณจะเห็นว่ามันแสดงรายการไฟล์และไดเรกทอรีที่มีตัวอักษร "s" อย่างไรก็ตามจะไม่มีไฟล์ที่ขึ้นต้นด้วยจุดนำ ในการแสดงพวกเขาคุณสามารถใช้:

echo .*s*

นี่เป็นเพราะเชลล์ปฏิเสธที่จะขยาย*เพื่อครอบคลุมจุดนำ ซึ่งหมายความว่า:

rm -fr *

จะไม่เข้า..มา

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