คำสั่งที่จะลบไฟล์ทั้งหมด แต่ไม่ใช่ไดเรกทอรีคืออะไร?


23

สมมติว่าฉันมีต้นไม้ไดเรกทอรีเช่นนี้

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

หากฉันใช้rm -r FOLDER/*ทุกอย่างในโฟลเดอร์จะถูกลบรวมถึงไดเรกทอรีย่อย ฉันจะลบไฟล์ทั้งหมดใน FOLDER และในไดเรกทอรีย่อยโดยไม่ต้องลบไดเรกทอรีจริงได้อย่างไร

คำตอบ:


37

สิ่งที่คุณพยายามทำคือลบแบบเรียกซ้ำ สำหรับสิ่งที่คุณจำเป็นต้องมีเครื่องมือ recursive findเช่น

find FOLDER -type f -delete

13

ด้วยbash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

ที่นี่วนซ้ำชื่อไฟล์ที่ขยายแบบกลมและลบเฉพาะไฟล์

ด้านบนเป็นแบบแห้งหากพอใจกับการเปลี่ยนแปลงที่จะทำให้ลบechoเพื่อการลบที่แท้จริง:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

ในที่สุดยกเลิกการตั้งค่าglobstar:

shopt -u globstar

ด้วยการzshใช้ประโยชน์จาก qualifier glob:

echo -- FOLDER/**/*(.)

(.) เป็นตัวระบุแบบกลมที่ จำกัด การขยายแบบ glob เป็นไฟล์ปกติเท่านั้น

ด้านบนจะพิมพ์ชื่อไฟล์สำหรับการลบจริง:

rm -- FOLDER/**/*(.)

2
+1 สำหรับ zsh globbing ผู้คนมากขึ้นควรตระหนักถึงสิ่งที่น่ากลัว zsh สามารถทำได้
marcelm

11

หากเวอร์ชันของคุณfindไม่รองรับ-deleteคุณสามารถใช้สิ่งต่อไปนี้เพื่อลบไฟล์ทุกไฟล์ในไดเรกทอรีปัจจุบันและด้านล่าง

find . ! -type d -exec rm '{}' \;

-exec rm {} +จะเร็วขึ้นโดยเฉพาะหากมีไฟล์จำนวนมาก
muru

และfind . ! -type d -exec rm {} +ลบลิงค์ sym ด้วย
ความยุติธรรมสำหรับโมนิก้า

1
@muru: หากการใช้งานเฉพาะของfindไม่รองรับ-deleteก็อาจไม่สนับสนุน-exec ... {} +อย่างใดอย่างหนึ่ง วิธีที่แนะนำในการจัดการกับสิ่งนั้นคือfind ... -print0 | xargs -r0 rm(หากคาดว่าจะมีการจับคู่ที่เป็นไปได้จำนวนมาก)
David Foerster

5
@DavidFoerster ไม่ได้จริงๆ -exec ... {} +คือ POSIX แต่-deleteไม่ใช่ (ไม่เป็น-print0อย่างนั้น)
muru

@muru: ยุติธรรมเพียงพอ ฉันพบการใช้งานที่ไม่ใช่ POSIX อย่างน้อยสองรายการfindที่สนับสนุน-print0แต่ไม่ใช่-exec ... {} +(ฉันจำไม่ได้-deleteว่า) หนึ่งคือบน OS X อีกหนึ่งใน Solaris (ไม่กี่ปีที่ผ่านมาในระบบที่ปรับปรุงอย่างอนุรักษ์นิยม) นอกจากนี้คุณยังสามารถใช้แทนด้วย-print0 -printf '%p\0'อย่างไรก็ตามนี่คือ Ask Ubuntuไม่ใช่Unix & Linuxและ Ubuntu ใช้ GNU find ตลอดไป
David Foerster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.