จะลบไฟล์ทั้งหมดในไดเรกทอรีได้อย่างไร?


76

ฉันพยายามลบไฟล์และไดเรกทอรีย่อยทั้งหมดในไดเรกทอรี ฉันเคยrm -rลบไฟล์ทั้งหมด แต่ฉันต้องการลบไฟล์และไดเรกทอรีย่อยทั้งหมดยกเว้นไดเรกทอรีบนสุด

imagesตัวอย่างเช่นผมมีไดเรกทอรีชั้นนำเช่น มันมีไฟล์header.png, footer.pngและไดเรกทอรีย่อย

ตอนนี้ผมต้องการที่จะลบheader.png, footer.pngและไดเรกทอรีย่อย imagesแต่ไม่

ฉันจะทำสิ่งนี้ใน linux ได้อย่างไร


1
cd ลงในไดเรกทอรีและทำrm -Rfไฟล์และไดเรกทอรีทั้งหมดในนั้น
Noufal Ibrahim

คำตอบ:


59

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


30
ไฟล์ที่ซ่อนจะไม่ถูกลบ
reto

50

ในการลบไฟล์ที่ซ่อนอยู่คุณต้องระบุ:

rm -r images/* images/.*

ด้วยกระสุนที่ globs รวม.และ..สิ่งนี้จะนำไปสู่ข้อผิดพลาดเช่น

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

แต่มันจะลบไฟล์ที่ซ่อนอยู่

วิธีการที่ไม่มีข้อความผิดพลาดคือใช้ find / delete ด้วย mindepth นี่คือ gnu-find

find images -mindepth 1 -delete

การค้นหาของคุณอาจขาด-mindepthหรือเพร-deleteดิเคตซึ่งในกรณีนี้คุณสามารถทำได้:

find images/. ! -name . -prune -exec rm -rf {} +

คำแนะนำของฉันคือใช้ 'rm -r images /.*' ซึ่งจะตรงกับ 'images / .. ' แต่ไม่ใช่ 'images /../ .. ' การเรียกซ้ำไม่สามารถขึ้นไปได้เนื่องจาก 'images /../ images / .. ' เป็นไดเรกทอรีเดียวกันอีกครั้ง
ผู้ใช้ที่ไม่รู้จัก

4
@DarkHeart rm .*ไม่ลบ.หรือ..และไม่ได้เพราะอย่างน้อย 1,994 สำหรับ utils GNU และมีแนวโน้มที่ตั้งแต่ช่วงปลายยุค 70 สำหรับ UNIX เป็นไปได้ยากมากที่คุณจะพบระบบที่rm .*สำรวจระบบไฟล์ขึ้นด้านนอกพิพิธภัณฑ์
terdon

21

ในการลบไฟล์และไดเรกทอรีทั้งหมด (รวมถึงไฟล์ที่ซ่อนอยู่ ) ในไดเรกทอรีคุณสามารถลองทำสิ่งต่อไปนี้:

  • ใช้ls -Abเพื่อจับคู่ไฟล์ / ไดเรกทอรีทั้งหมด

    cd dir_name && rm -rf `ls -Ab`
    
  • ใช้findเพื่อจับคู่ไฟล์ / ไดเรกทอรีทั้งหมด

    find dir_name -mindepth 1 -delete
    

    หรือหากคุณfindไม่รองรับ-delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • ลบโฟลเดอร์จากนั้นสร้างใหม่

    rm -rf dir_name && mkdir dir_name
    
  • ในทุบตี

    shopt -s dotglob  
    rm -rf dir_name/*
    

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

1
แก้ไข: เพื่อให้ปลอดภัยใช้rm -rf ./* ./.*
VasyaNovikov

9

ในการลบไฟล์ปกติทั้งหมดซ้ำภายในไดเรกทอรีคำสั่งนี้ (สมมติว่า GNU หรือ FreeBSD find) ดีพอ:

find . -type f -delete

ที่ทำให้ไฟล์ที่ไม่เป็นปกติทั้งหมดเช่น symlinks (ไม่ว่าพวกเขาจะชี้ไปที่ไฟล์ปกติหรือไม่), ไดเรกทอรี, fifos, ซ็อกเก็ต, อุปกรณ์ ...

ดูสิ่งนี้ด้วย:

find . ! -type d -delete

ลบไฟล์ประเภทใด ๆ ยกเว้นไดเรกทอรี


6

ลองรุ่นนี้:

 rm -r test/*

1
สิ่งนี้จะไม่ลบไฟล์ที่ซ่อนอยู่ (ไฟล์ที่ขึ้นต้นด้วย ".")
gbmhunter

3

ฉันใช้findคำสั่งที่นี่:

ขั้นตอนที่ 1:ค้นหาไฟล์ทั้งหมดและลบออก:

find /path/to/directory/ -type f -exec rm {} \;

ตัวอย่าง:

find /home/user/Desktop/images/ -type f -exec rm {} \;

ขั้นตอนที่ 2:ค้นหาไดเรกทอรีย่อยทั้งหมดและลบออก:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type dรวมถึง.จะลบไดเรกทอรีเอง คุณต้องใช้-mindepthสวิตช์ตามที่คนอื่นพูดด้วย
Arthur Tacca

3

คำถามคือการล้างไดเรกทอรี = ลบเนื้อหาของไดเรกทอรีรวมถึงไฟล์ที่ซ่อนอยู่ แต่ไม่ใช่ไดเรกทอรี คำสั่ง find พร้อมกับ -mindepth 1 เป็นวิธีที่ถูกต้องจริง ๆ แต่เพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดต้องรวมกับ -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

0

ไวยากรณ์ของ rm คือ:

rm [OPTION]... FILE...

ดังนั้นคุณต้องระบุเส้นทางที่เหมาะสมอย่างชัดเจนเช่น

rm -r sub_dir/

0

คุณสามารถลบไดเรกทอรีโดยใช้คำสั่งต่อไปนี้:

sudo rm -r directoryname1/2/3/*

มันจะถูกลบทั้งไดเรกทอรีหลังจาก 3 / *

ตัวอย่าง sudo rm -r ดาวน์โหลด / เพลง / *

Downloads/songมันจะลบไฟล์ทั้งหมดที่อยู่ภายใน


0

สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันทดสอบหลาย ๆ รูปแบบที่ทำงานทุกครั้ง

จากไดเรกทอรีที่เก็บไดเรกทอรีรูปภาพ

rm -frd ./images/*

ก่อน:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

หลังจาก:

images/

ไม่แน่ใจว่ามันถูกสร้างขึ้นมาอย่างชัดเจนในคำถามเดิม แต่เพียงเพื่อชี้ให้เห็นว่าถ้าคุณเปิดใช้งาน dotglob นี้จะข้ามใด ๆ "จุดไฟล์" หรือจุดไดเรกทอรีภายใต้ภาพ ( mkdir images/.somedir; touch images/.somefile)
เจฟฟ์ Schaller

0

ในการลบไฟล์และไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีปัจจุบันรวมถึงไฟล์ที่ซ่อนอยู่โดยไม่มีข้อผิดพลาด :

rm -rf .[^.] .??* *

หรือจากไดเรกทอรีหลัก:

rm -rf images/.[^.] images/.??* images/*

จากhttps://serverfault.com/a/47940/269538



-2

ลบโฟลเดอร์ "test" และไฟล์ทั้งหมดที่อยู่ภายใน:

 rm -r test

ลบไฟล์ทั้งหมดที่อยู่ข้างใน แต่เก็บโฟลเดอร์ "test":

 rm -r test/*

-4

cd ในโฟลเดอร์จากนั้นดำเนินการคำสั่งต่อไปนี้:

ls |xargs rm -rf

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