ใน Unix คุณจะลบทุกอย่างในไดเร็กทอรีปัจจุบันและด้านล่างได้อย่างไร?


108

ฉันรู้ว่าสิ่งนี้จะลบทุกอย่างในไดเรกทอรีย่อยและด้านล่าง:

rm -rf <subdir-name>

แต่คุณจะลบทุกอย่างในไดเร็กทอรีปัจจุบันตลอดจนทุกไดเร็กทอรีย่อยด้านล่างและเนื้อหาของไดเร็กทอรีย่อยทั้งหมดได้อย่างไร


2
สิ่งนี้ต้องหลอกลวง: stackoverflow.com/questions/550922/…
jmucchiello

คำตอบ:


166

ฝึกฝนการใช้คอมพิวเตอร์อย่างปลอดภัย เพียงเพิ่มขึ้นหนึ่งระดับในลำดับชั้นและอย่าใช้นิพจน์ตัวแทน:

cd ..; rm -rf -- <dir-to-remove>

ขีดสองขีด--บอกrmว่า<dir-to-remove>ไม่ใช่ตัวเลือกบรรทัดคำสั่งแม้ว่าจะขึ้นต้นด้วยเครื่องหมายขีดกลางก็ตาม


8
ทำไมถึงปลอดภัยกว่านี้?
เยน

34
เนื่องจากคุณจับคู่ไดเร็กทอรีที่มีชื่อโดยเฉพาะและมีโอกาสน้อยที่จะลบสิ่งที่คุณไม่ต้องการลบ
tvanfosson

5
จริง. ฉันเห็นว่าตัวเองทำแบบนั้นได้อย่างง่ายดาย
เยน

26
มันไม่ลบไดเรกทอรีตัวเองด้วยเหรอ? คุณต้องทำ mkdir <dir-to-remove> หลังจากนั้น แต่ฮาร์ดลิงก์ใด ๆ ที่อ้างถึงไดเร็กทอรีนั้นจะเป็นไดเร็กทอรีที่แตกต่างกันในภายหลัง
Johannes Schaub -

5
@ เยนถ้าคุณใช้rm ./คุณอาจพิมพ์โดยบังเอิญrm . /ซึ่งอาจเป็นหายนะ
irfandar

44

จะลบไฟล์ / ไดเรกทอรีทั้งหมดด้านล่างไฟล์ปัจจุบัน

find -mindepth 1 -delete

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

find <name-of-directory> -mindepth 1 -delete

หากคุณต้องการที่จะลบไม่เพียง แต่ไดเรกทอรีย่อยและไฟล์ของมัน -mindepth 1แต่ยังไดเรกทอรีของตัวเองงด ทำโดยไม่ต้อง-deleteรับรายการสิ่งที่จะถูกลบออก


ฉันต้องการลบไฟล์ทั้งหมดในไดเรกทอรีย่อย แต่ไม่ต้องการลบไดเรกทอรีย่อยด้วยตัวเอง ค้นหา <name-of-direcotry> -mindepth 2 -delete ทำงานได้ดีมาก!
Tim Dearborn

คุณต้องการ-mindepth 1ถ้าคุณกำลังระบุไดเร็กทอรี ( find <name-of-directory> -mindepth 1 -delete) มิฉะนั้นโจฮันเนสจะถูกต้องจะไม่ลบไดเร็กทอรีการทำงานปัจจุบัน (เมื่อใช้find -delete)
Weboide

IMO นี่คือคำตอบที่ดีที่สุดโดยเฉพาะในสคริปต์
wizonesolutions

1
ฉันพยายาม: find -mindepth 1 -deleteแต่ฉันได้รับ illegal option -- mแต่มันใช้งานได้ดีเมื่อฉันลบตัวเลือก mindepthfind . -delete
ชารอน

41

สิ่งที่ฉันมักจะทำคือการพิมพ์

rm -rf *

และจากนั้นกด * ESC-และทุบตีจะขยาย * ไปยังรายการที่ชัดเจนของไฟล์และไดเรกทอรีในไดเรกทอรีการทำงานปัจจุบัน

ประโยชน์คือ:

  • ฉันสามารถตรวจสอบรายการไฟล์ที่จะลบก่อนที่จะกดปุ่ม ENTER
  • ประวัติคำสั่งจะไม่มี "rm -rf *" โดยที่ไวลด์การ์ดยังคงอยู่ซึ่งอาจถูกนำมาใช้ซ้ำโดยไม่ได้ตั้งใจในเวลาที่ไม่ถูกต้อง แต่ประวัติคำสั่งจะมีชื่อไฟล์ที่แท้จริงอยู่ในนั้น
  • นอกจากนี้ยังมีประโยชน์อีกครั้งหนึ่งหรือสองครั้งในการตอบว่า "รอสักครู่ ... ฉันเพิ่งลบไฟล์ใดไป" ชื่อไฟล์จะปรากฏในบัฟเฟอร์การเลื่อนเทอร์มินัลหรือประวัติคำสั่ง

อันที่จริงฉันชอบสิ่งนี้มากจนทำให้เป็นพฤติกรรมเริ่มต้นสำหรับ TAB ด้วยบรรทัดนี้ใน. bashrc:

bind TAB:insert-completions

--คำตอบนี้หายไปหรือไม่ วิธีนี้ยอดเยี่ยมโดยรวมต้องบอกว่า
Ben Voigt

วิธีที่ดีกว่าคือรันด้วย sudo
Abbas Torabi

22

ใช้

rm -rf *

อัปเดต: .ย่อมาจากไดเรกทอรีปัจจุบัน แต่เราไม่สามารถใช้สิ่งนี้ได้ คำสั่งที่ดูเหมือนว่าจะมีการตรวจสอบที่ชัดเจนสำหรับและ. ..ใช้ไวลด์การ์ด globbing แทน แต่อาจมีความเสี่ยง

IMO เวอร์ชันที่ปลอดภัยกว่าคือการใช้:

rm -ri * 

(สิ่งนี้จะแจ้งให้คุณยืนยันก่อนที่จะลบทุกไฟล์ / ไดเร็กทอรี)


13
"อาจมีความเสี่ยง" นั้นพูดน้อยอย่างน่าอัศจรรย์

5
เมื่อทำสิ่งนี้ฉันพบ ls -r อย่างรวดเร็ว ก่อนอื่นให้คุณดูว่าคุณกำลังจะลบอะไร มีประโยชน์เพื่อให้ทราบอย่างรวดเร็วว่าคุณจะไม่ลบดิสก์ทั้งหมด ...
Rich Bradshaw

2
ทำไมถึงเสี่ยงกว่า rm -rf <subdir-name>?
เยน

2
@ เยน - เพราะถ้าคุณทำผิดที่คุณจะได้รับผลร้าย การใช้ชื่อเฉพาะผิดตำแหน่งจะผิดพลาดได้ก็ต่อเมื่อมีไดเร็กทอรีย่อยเดียวกันเกิดขึ้นที่นั่น
tvanfosson

1
คุณไม่สามารถลบผู้ปกครองในขณะที่อาศัยอยู่ในเด็กได้
สม่ำเสมอ

6

ถูกต้องที่rm –rf .จะลบทุกอย่างในปัจจุบันโดยตรงรวมถึงไดเรกทอรีย่อยและเนื้อหา จุดเดียว ( .) หมายถึงไดเรกทอรีปัจจุบัน ระวังอย่าทำrm -rf ..เนื่องจากจุดคู่ ( ..) หมายถึงไดเร็กทอรีก่อนหน้า

สิ่งนี้ถูกกล่าวว่าถ้าคุณเป็นเหมือนฉันและเปิดหน้าต่างเทอร์มินัลหลายเครื่องพร้อมกันคุณควรปลอดภัยและใช้rm -ir .Lets ดูอาร์กิวเมนต์คำสั่งเพื่อทำความเข้าใจว่าทำไม

ขั้นแรกถ้าคุณดูที่หน้าrmcommand man ( man rmภายใต้ Unix ส่วนใหญ่) คุณสังเกตเห็นว่า–r"ลบเนื้อหาของไดเรกทอรีแบบวนซ้ำ" ดังนั้นการทำrm -r .คนเดียวจะลบทุกอย่างในไดเร็กทอรีปัจจุบันและทุกอย่างก็ร้อง

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

ในrm -ri .ทางกลับกัน-iซึ่งจะแทนที่-fวิธีการ "แจ้งก่อนการลบ" ซึ่งหมายความว่าคุณจะมีโอกาสพูดว่า "oups! that's not what I want" ก่อนที่ rm จะลบไฟล์ทั้งหมดอย่างมีความสุข

ในวันแรกของฉันฉันทำrm -rf /ระบบในขณะที่เข้าสู่ระบบด้วยสิทธิ์เต็มรูปแบบ (root) ผลที่ได้คือสองวันผ่านไปการกู้คืนระบบจากการสำรองข้อมูล นั่นเป็นเหตุผลที่ตอนนี้ผมจ้างrm -riในขณะนี้


6

เกี่ยวกับ:

rm -rf "$(pwd -P)"/* 

27
jQuery มีประสิทธิภาพมาก
Pawel

5
rm  -rf * 

อย่าทำ! มันอันตราย! ตรวจสอบให้แน่ใจว่าคุณอยู่ในทิศทางที่ถูกต้อง!


4

ตรวจสอบให้แน่ใจคุณอยู่ในไดเร็กทอรีที่ถูกต้อง

rm -rf *

2
สิ่งนี้ไม่ได้ลบไฟล์หรือไดเร็กทอรีย่อยที่ชื่อขึ้นต้นด้วยจุด

1
จริง. ในการทดสอบของฉัน rm -rf ไม่ได้ tvanfosson มี IMO ที่ดีที่สุดด้วย "cd .. ; rm -rf <dir-to-remove>"
digitaljoel

2

วิธีแก้ปัญหาทั่วไปที่ปลอดภัยและง่ายที่สุดนี้น่าจะเป็น:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

1

ฉันเชื่อว่าคำตอบนี้ดีกว่า:

/unix/12593/how-to-remove-all-the-files-in-a-directory

หากไดเรกทอรีระดับบนสุดของคุณเรียกว่าเรียกแล้วimages rm -r images/*สิ่งนี้ใช้ตัวดำเนินการ shell glob *เพื่อรันrm -rบนทุกไฟล์หรือไดเร็กทอรีภายในอิมเมจ

โดยพื้นฐานแล้วคุณขึ้นไปหนึ่งระดับแล้วพูดว่าลบทุกอย่างในไดเรกทอรี X ด้วยวิธีนี้คุณจะยังคงระบุว่าโฟลเดอร์ใดควรมีการลบเนื้อหาซึ่งปลอดภัยกว่าเพียงแค่พูดว่า "ลบทุกอย่างที่นี่" ในขณะที่ยังคงรักษาโฟลเดอร์เดิมไว้ (ซึ่งบางครั้งคุณต้องการเพราะคุณไม่ได้รับอนุญาตหรือไม่ต้องการ เพื่อแก้ไขสิทธิ์ที่มีอยู่ของโฟลเดอร์)

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