rm -r ทำงานอย่างไรในการลบแบบเรียกซ้ำ? ในลำดับใด


30

มีคำสั่งของการดำเนินงานที่จะrm? ฉันดำเนินการrmในไดเรกทอรีขนาดใหญ่และฉันอยากรู้ว่าควรดูว่ามีอะไรที่ถูกลบไปบ้าง ไม่rmทำงานในไฟล์แรกแล้วไดเรกทอรี? หรือมันเป็นไปตามข้อมูลบางอย่างในตารางไอโหนด?

ข้อมูลจำเพาะ: rm จาก GNU coreutils 8.22 ระบบ: Arch Linux ทำงานบนระบบไฟล์ beagleboneblack ที่ทำงานอยู่เป็น Seagate HDD (ext4) ภายนอกโดยใช้ USB 2.0

backstory:

ฉันกำลังทำการล้างข้อมูลไดเรกทอรีและดำเนินการ

cp -r A/ B/ C/ Dest/

ฉันติดตามไปด้วยโดยไม่เจตนา

rm -r A/ B/ C/ Dest/

เมื่อฉันตั้งใจจะแสดง

rm -r A/ B/ C/

ฉันจับได้แล้วกดCtrl+ Cก่อนที่จะผ่านไปนานเกินไป โดยเฉพาะมันเป็น <3 วินาทีขณะที่ผมกำลังใช้timeคำสั่งร่วมกับ&rm cpฉันเข้าไปในและตรวจสอบโดยDest/คาดหวังว่ามันจะไม่มีอยู่จริง แต่ดูเถิดและเห็นว่ามันเป็นทั้งหมดและดูเหมือนจะไม่ได้รับผลกระทบ มันค่อนข้างน่าแปลกใจเพราะA/ B/ C/ค่อนข้างเล็ก อาจรวม 100–200 MB Dest/อย่างไรก็ตามเป็นเพียง 1TB การดำเนินการlsบน Dest / แสดงให้เห็นว่ามีทั้งไฟล์และไดเรกทอรีที่ปลายทั้งสองของตัวอักษร (เช่นAFile.txt.... .... Zoo.txt)

ฉันได้รับโชคดีและถูกยกเลิกrmก่อนที่มันจะทำลายล้างในไดเร็กทอรี Dest / ของฉันหรือไม่? คือrmจริงๆที่ช้า (Thankfully!)?

ถ้าไม่เป็นrmเช่นนั้นฉันจะเดาได้ว่าสิ่งที่หายไปจะเกิดขึ้นซ้ำ ๆ ได้อย่างไร

ฉันไม่ได้คาดหวังที่จะกู้คืนสิ่งที่ฉันอาจจะสูญเสียเพียงแค่อยากรู้ว่าสิ่งที่อาจถูกพัดหายไป


2
สิ่งที่เกี่ยวข้อง: ไฟล์จะไปเมื่อคำสั่ง rm ถูกใช้?
slm

คำตอบ:


34

rm -rทำงานในแต่ละข้อโต้แย้งของมันในทางกลับกัน หากอาร์กิวเมนต์เป็นไดเรคทอรีจะแสดงรายการไดเรกทอรี (พร้อมกับopendirและreaddirฟังก์ชั่นหรือวิธีการที่เทียบเท่า) และดำเนินการกับแต่ละรายการตามลำดับ หากรายการนั้นเป็นไดเรกทอรีรายการนั้นจะสำรวจรายการนั้นซ้ำ ๆ

ตรงนี้เป็นวิธีเดียวกับที่โปรแกรมอื่น ๆ ที่ใช้ในการไดเรกทอรีขวางซ้ำ - find, ls -Rfฯลฯ

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

โปรดสังเกตว่าlsหรือecho *เรียงลำดับไฟล์ตามลำดับคำศัพท์ของชื่อไฟล์ findและls -fอย่าเรียงลำดับ

สิ่งหนึ่งที่คุณวางใจได้คือการจัดการข้อโต้แย้งตามลำดับ ดังนั้นหากC/ยังมีบางส่วนอยู่นั่นหมายความว่าDest/ไม่มีการแตะต้อง หากC/หายไปคุณสามารถทราบได้ว่าไฟล์ถูกลบไปแล้วDest/ด้วยการตรวจสอบเวลาการปรับเปลี่ยนไดเรกทอรีและเปรียบเทียบกับเวลาที่C/ถูกลบหรือเวลาสิ้นสุดการคัดลอก ไฟล์แรกที่จะลบอาจเป็นไฟล์โดยตรงDest/หรือในบางส่วนลึกลงไปในลำดับชั้นขึ้นอยู่กับว่ารายการแรกในDest/ที่rmเกิดขึ้นกับการสำรวจคือไดเรกทอรีหรือไม่

ความเร็วของการrmเป็นส่วนใหญ่เป็นเรื่องของจำนวนไฟล์ที่มีการลบ มันเป็นไฟล์ที่มีขนาดใหญ่มากที่จะมีผลกระทบที่เห็นได้ชัดในเวลาที่ลบ ส่วนใหญ่ของงานคือการลบแต่ละรายการไดเรกทอรีในทางกลับกัน ข้อมูลของไฟล์ไม่ได้ถูกลบการลบเนื้อหาของไฟล์จะต้องทำเครื่องหมายบล็อกที่ใช้เป็นอิสระซึ่งค่อนข้างเร็ว


2
-fตัวเลือกในการlsจัดทำเอกสารเป็นเทียบเท่ากับ-aUที่-aหมายถึงรายการไฟล์ทั้งหมดและ-Uวิธีการคัดเลือก ฉันจำการเผชิญหน้ากับเวอร์ชันlsที่-fไม่ได้ผล (ฉันคิดว่ามันถูกกำหนดให้เป็นอย่างอื่น) แต่-aUทำ
G-Man กล่าวว่า 'Reinstate Monica'

2
@ G-Man POSIXกำหนด-f(เป็นส่วนขยาย XSI ) มันมีผลกระทบอื่น ๆ มันกลับไปที่ V7 ดังนั้นคุณจะถูกกดอย่างหนักเพื่อหาการใช้งานโดยไม่ต้องใช้นอกเหนือจาก BusyBox ที่แปลกประหลาด -Uสำหรับคุณสมบัติที่ยังไม่ได้เรียงเป็น GNU ฉันไม่คิดว่ามันจะมีอยู่ที่อื่น
Gilles 'หยุดชั่วร้าย'


@ เลขที่คุณสามารถทดสอบได้โดยการเรียกใช้ls -Uในไดเรกทอรี นี่คือลำดับเดียวกันกับที่rm -rจะทำงานในไดเรกทอรีนั้น โปรดทราบว่าการเพิ่มหรือลบไฟล์สามารถเปลี่ยนลำดับของไฟล์อื่นได้
Gilles 'หยุดความชั่วร้าย'

ขอบคุณ (1) "การเพิ่มหรือลบไฟล์สามารถเปลี่ยนลำดับของไฟล์อื่น ๆ " ดังนั้นหลังจากการลบบางส่วนโดยls -Uไม่ได้ตั้งใจจะไม่ช่วยให้ทราบว่า dir ที่รอดชีวิตไม่ได้ถูกแตะต้องหรือไม่? (2) -U หมายถึง "รายการรายการในลำดับไดเรกทอรี" -U หมายถึงลำดับของรายการไดเรกทอรีใน dir หรือไม่?
ทิม

5

ดังที่ Gilles กล่าวว่าโดยทั่วไปคุณไม่สามารถคาดเดาลำดับของการลบภายในไดเรกทอรีได้เพียงว่าไดเรกทอรีระดับบนสุดจะถูกประมวลผลตามลำดับในบรรทัดคำสั่ง

อย่างไรก็ตามคุณรับประกันได้ด้วยว่ามันจะลบลำดับชั้นของไดเรกทอรีจากด้านล่างขึ้นไปเพราะ Unix อนุญาตให้ลบไดเรกทอรีเฉพาะในกรณีที่ว่างเปล่า ดังนั้นเพื่อที่จะลบไดเรกทอรีมันต้องลบทุกอย่างในนั้นก่อน หากมีไดเรกทอรีย่อยจะต้องลบเนื้อหาออกก่อนและอื่น ๆ

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