วิธีการลบไฟล์และไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีโดยไม่ต้องลบไดเรกทอรีในทุบตี?


53

มีคำสั่งให้ลบไฟล์และไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีโดยไม่ลบไดเรกทอรีหรือไม่

ตัวอย่างเช่นถ้าฉันมีไดเรกทอรี "dontDeleteMe" ที่มีไดเรกทอรีย่อย "1", "2", "3" และแต่ละไดเรกทอรีย่อยมีรูปภาพไม่กี่ภาพฉันจะลบไดเรกทอรีย่อย "1", "2" และ "3" ได้อย่างไร และไฟล์ทั้งหมดในนั้นโดยไม่ลบไดเรกทอรีหลัก "dontDeleteMe" หรือไม่

คำตอบ:


66

หากต้องการลบทุกสิ่งในไดเรกทอรีโดยไม่ลบไดเรกทอรีให้พิมพ์:

rm -rfv dontDeleteMe/*

โปรดทราบว่า/*ส่วนนี้มีความสำคัญมาก หากคุณเว้นวรรคไว้ข้างหน้า*มันจะลบไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันของคุณ

นอกจากนี้ยังต้องระวังให้มากเล่นกับrm, -rและ*ทั้งหมดในคำสั่งเดียวกัน พวกเขาสามารถเป็นความหายนะ

อัปเดต: โอเคฉันรู้ว่าคุณมีไฟล์ซ่อน / จุด [ชื่อไฟล์ที่มีจุดอยู่ที่จุดเริ่มต้นเช่น.hidden] จากนั้นสิ่งนี้จะทำให้ไฟล์เหล่านั้นไม่เสียหาย

ดังนั้นคำตอบที่ง่ายที่สุดสำหรับคำถามเดิมคือ: rm -rfv dontDeleteMe && mkdir dontDeleteMe

อีกคนหนึ่งจะใช้find's -execตัวเลือกหรือท่อxargs(ด้านล่าง):

find dontDeleteMe/* -print0 | xargs -0 rm -rv


คุณสามารถยกตัวอย่างการใช้ xargs ได้หรือไม่? xargs คืออะไร
justingrif

@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv ฉันเชื่อในกรณีส่วนใหญ่นี้จะทำงานได้โดยไม่คำนึงถึงช่องว่างและสิ่งที่ไม่ แต่ซีดีไปที่/tmp/และทำไดเรกทอรีทดสอบและลอง :)
Matt

โอ้และจาก manpage: "xargs - สร้างและดำเนินการบรรทัดคำสั่งจากอินพุตมาตรฐาน"
Matt

5
การสร้างไดเรกทอรีใหม่ไม่เท่ากับการลบเนื้อหา เช่นความแตกต่างของการอนุญาตไดเรกทอรี umask ความแตกต่างของเจ้าของ ฯลฯ ... คำตอบของ enzotibจะช่วยแก้ปัญหาเกี่ยวกับไวยากรณ์ดั้งเดิมของคุณ

3
นี่ไม่ใช่คำตอบที่ดี การใช้ * เป็นสิ่งที่อันตรายและจะไม่ทำงานบน dotfiles หากไม่มี "dotglob" (ดูด้านล่าง) rm -rf dontDeleteMe && mkdir dontDeleteMeไม่แน่ใจว่า dir นั้นถูกสร้างขึ้นใหม่ด้วยสิทธิ์ / เจ้าของเดียวกัน ให้ใช้find dontDeleteMe/ -mindepth 1 -deleteตัวแปรตัวใดตัวหนึ่งด้านล่างแทน
Nils Toedtmann

27

เหตุผลเดียวที่rm -r ./*ไม่เคยทำงานเป็นเพราะคุณจะมีไฟล์ที่ซ่อนอยู่และ / *หรือโฟลเดอร์ที่ไม่ตรงกับ

ด้วยเหตุนี้bashให้ตัวเลือกในการ*จับคู่ทุกอย่างแม้กระทั่งวัตถุที่ซ่อนอยู่:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

มันจะมีประโยชน์ในการรีเซ็ตdotglobเป็นสถานะเริ่มต้น (unset) หากคุณยังคงใช้เชลล์ที่คุณใช้คำสั่งข้างต้น:

shopt -u dotglob 

มันไม่สามารถใช้งานได้เมื่อคุณมีไฟล์จำนวนมาก
..

23

เปิดเทอร์มินัล ( Ctrl+ Alt+ T) พิมพ์มดนี้:

find somedir -mindepth 1 -delete

นี้จะตรงกับไฟล์และไดเรกทอรีทั้งหมดภายในsomedirและ (Grand-) ของเด็กรวมทั้ง "ซ่อน" ไฟล์จุด แต่ไม่รวมถึงsomedirตัวเองเพราะ-mindepth 1จากนั้น-deleteพวกเขา


ยินดีต้อนรับสู่ AskUbuntu! ในขณะที่คำตอบของคุณอาจช่วยโปสเตอร์ต้นฉบับได้ แต่การขาดข้อมูลเพื่ออธิบายสิ่งที่จะทำเพื่อช่วยเขา / เธอทำให้คำตอบของคุณไม่สมบูรณ์
Oyibo

3
ไม่มีคำอธิบาย แต่ยังเป็นคำตอบที่ดีที่สุด ใช้งานได้ใน OSX (ยกเว้นวิธีเปิดเทอร์มินัล)
noamtm

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

ใช้xdevตัวเลือกเพื่อลบไฟล์ภายในขอบเขตอุปกรณ์เท่านั้น


GNU -deleteพบมี มันบ่งบอก-depthและจดจำได้ง่ายกว่า-depth -exec rm -Rf {} \;
Nils Toedtmann

4

หากต้องการลบ (ในเทอร์มินัล) ไฟล์และไดเรกทอรีย่อยทั้งหมดยกเว้นไดเรกทอรีฐานชื่อ "dontdelete":

rm -rf dontdelete/*

นี่ไม่ใช่การลบไฟล์ที่ซ่อนดังนั้น "ไฟล์ทั้งหมด" อาจเป็นคำสั่งที่หนาเกินไป
Stefan van den Akker

4

คุณสามารถใช้findกับ-deleteธง:

find dontDeleteMe/* -delete

/*เป็นสิ่งสำคัญที่จะบอกfindค้นหาเฉพาะภายในโฟลเดอร์ที่เรียกว่า "dontDeleteMe"

ตรวจสอบให้แน่ใจด้วยว่า-deleteแฟล็กอยู่ที่ท้ายfindคำสั่ง


1
dotglobการแก้ปัญหานี้จะไม่ลบไฟล์ที่ซ่อนเว้นแต่คุณเปิดใช้งาน มิฉะนั้นการใช้-mindepth 1ตัวเลือกการตั้งค่าสถานะดูเหมือนจะเป็นวิธีเดียวที่จะทำให้มันใช้งานได้
Stefan van den Akker

3
rm -rf  directory/{.*,/*}

พูดว่าอะไร:

ลบไฟล์ทั้งหมดที่เริ่มต้นด้วย ใน "ไดเรกทอรี" และไฟล์อื่นทั้งหมดด้วย

แม้ว่าNeftas จะได้รับการกล่าวถึงอย่างสุภาพแต่วิธีนี้ไม่ปลอดภัย!

วิธีที่ปลอดภัยกว่าคือ:

 rm -rf directory/!(.|..)

คำสั่งนี้อาจเป็นอันตรายได้เนื่องจากคุณรวม.และ..ไดเรกทอรีด้วย นี้อาจหลีกเลี่ยงได้โดยการเปลี่ยน{.*}ไปแต่แล้วคุณจะไม่ลบไฟล์ที่ซ่อนอยู่มีเพียงตัวละครตัวหนึ่งเช่น{.??*} .a
Stefan van den Akker

เกี่ยวกับอะไร rm -rf directory /! (. | .. )
Tebe

ดูเหมือนว่าจะเป็นทางออกที่ดีกว่าที่ฉันคิดไว้ ฉันขอแนะนำให้คุณแก้ไขคำตอบของคุณได้ไหม
Stefan van den Akker

ยอมรับข้อเสนอแนะแล้ว)
Tebe

1

ฉันไม่แน่ใจว่าทำไมสิ่งนี้ถึงซับซ้อนช่วยฉันได้ถ้าฉันผิด

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

แค่นั้นแหละ


นี่เป็นข้อบกพร่องเล็กน้อยในการพยายามลบไดเรกทอรีปัจจุบันด้วยซึ่งแน่นอนว่าใช้งานไม่ได้เพราะยังคงใช้งานเป็นไดเรกทอรีทำงานของเชลล์ที่กล่าวอ้าง
David Foerster

1

มีคำตอบที่ง่ายยิ่งขึ้น:

  1. cd dontDeleteMe

  2. rm -rf *

เวลาบรรยายการดูแลระบบขั้นพื้นฐาน: อย่าลืมว่าคุณอยู่ที่ไหนเมื่อคุณใช้คำสั่งการกวาดเช่นนี้

ฉันไม่สามารถพูดได้มากพอ ฉันต้องกู้กล่องเพราะไม่มีใครสนใจและพิมพ์ลงไปrm -rf *ใน /

* ระวังถือว่าถ้าคุณเป็นรูทหรือถ้าคุณ sudo-ing เป็นรูทที่คุณรู้ว่าคุณกำลังทำอะไรอยู่ ดังนั้นให้แน่ใจว่าคุณรู้ว่าสิ่งที่คุณทำก่อนที่จะทำ

อีกทางเลือกหนึ่งที่ทำให้แน่ใจว่าคำสั่ง 'cd' ของคุณใช้งานได้ก่อนที่คุณจะใช้ 'rm'

cd dontDeleteMe && rm -rf *

6
นี่เป็นคำแนะนำที่อันตราย สิ่งที่คุณต้องการคือ: cd dontDeleteMe && rm -rf *
Izkata

@Izkata หรือตรวจสอบให้แน่ใจว่าการดำเนินการ cd ประสบความสำเร็จก่อนที่จะออกคำสั่ง rm
Eliah Kagan

1
@EliahKagan นั่นคือสิ่งที่ข้อมูลโค้ดของฉันไม่ ...
Izkata

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

5
@ user30619 ตัว&&ดำเนินการไม่เพียงเชื่อมโยงคำสั่งเข้าด้วยกันเท่านั้น มันต้องการให้แต่ละคำสั่งประสบความสำเร็จก่อนที่คำสั่งถัดไปจะถูกเรียกใช้ หากcdคำสั่งล้มเหลวด้วยเหตุผลใด ๆ (ไม่มีไดเรกทอรีสิทธิ์ ฯลฯ ) ดังนั้นrmคำสั่งจะไม่ถูกดำเนินการ ฉันจะเรียกว่าปลอดภัยกว่า
ean5533

0
  1. สิ่งที่ง่ายที่สุดสำหรับฉัน - ผู้เชี่ยวชาญ windows แต่เป็นมือใหม่ Ubuntu
  2. คลิกที่ไอคอนไฟล์บนตัวเรียกใช้งาน
  3. นำทางไปยังไดเรกทอรีที่มีไฟล์และโฟลเดอร์ที่คุณต้องการลบ
  4. คลิกขวาในพื้นที่ว่างของหน้าต่างถัดจากไฟล์และคลิก "เปิดในเทอร์มินัล" - เปิดหน้าต่างไฟล์ทิ้งไว้
  5. หน้าต่างเทอร์มินัลจะเปิดขึ้นและจะ "ตั้งค่า" ไปยังโฟลเดอร์ที่คุณอยู่
  6. คุณสามารถพิมพ์ "dir" (ไม่ต้องใส่เครื่องหมายคำพูดเมื่อฉันพูด type) และกด enter เพื่อแสดงรายการของไฟล์และโฟลเดอร์ - เพียงเพื่อพิสูจน์ว่าคุณเป็น "ใน" โฟลเดอร์ด้านขวา
  7. พิมพ์ "rm -rf *" แล้วกด Enter
  8. ขึ้นอยู่กับขนาดของโฟลเดอร์ / ไฟล์ที่จะลบระบบจะหยุดชั่วคราว
  9. เมื่อเทอร์มินัลพรอมต์ส่งคืนหน้าต่างไฟล์ที่คุณเปิดจะปรากฏเป็น "โฟลเดอร์ว่างเปล่า"
  10. ฉันประสบความสำเร็จในวิธีการนี้และทำให้ฉันรู้สึกสบายใจเมื่อเห็นไฟล์ / โฟลเดอร์ทั้งในหน้าต่างไฟล์และจากคำสั่ง Dir ในหน้าต่างเทอร์มินัล
  11. ฉันรู้สึกสบายใจที่หน้าต่างไฟล์แสดงโฟลเดอร์ตอนนี้ว่างเปล่า - โดยเฉพาะอย่างยิ่งเมื่อฉันไล่ตามไฟล์เหล่านี้รอบ ๆ เพื่อค้นหาโฟลเดอร์ถังขยะที่พวกเขาอยู่
  12. ขอบคุณทุกคนที่ส่งคำตอบ - มันเป็นข้อมูลที่ดีมาก

ดูเหมือนจะค่อนข้างซับซ้อน - โดยเฉพาะอย่างยิ่งเมื่อคุณต้องทำงานrm -rf *ต่อไป
David Foerster

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