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


289

สิ่งที่ฉันได้ใกล้เคียงที่สุดคือ

# rm /path/to/directory/*.*

แต่มันใช้ไม่ได้กับไฟล์ที่ไม่มีนามสกุล ...

คำตอบ:


340

Linux ไม่ใช้ส่วนขยาย มันขึ้นอยู่กับผู้สร้างไฟล์ที่จะตัดสินใจว่าเขาต้องการให้ชื่อมีนามสกุลหรือไม่ Linux มองไปที่ไบต์ที่ 1 เพื่อค้นหาว่าไฟล์นั้นเกี่ยวข้องกับอะไร

ในการลบทุกอย่างในไดเรกทอรีให้ใช้:

rm /path/to/directory/*

คุณสามารถใช้-rตัวเลือกตัวอย่างเช่น:

rm -r /path/to/directory/*

เพื่อลบไดเรกทอรีย่อยใด ๆ (รวมถึงเนื้อหาทั้งหมด) ภายในไดเรกทอรีที่คุณลบเนื้อหาของ มิฉะนั้นจะแสดงข้อผิดพลาดแจ้งให้คุณทราบว่าไม่ได้ลบไดเรกทอรี


13
หากคุณต้องการลบไฟล์ที่ซ่อนอยู่shopt -s dotglobก่อนที่จะรันrm (...)
danjjl

7
เครื่องหมาย * หมายถึงall files) *.*หมายถึงไฟล์ทั้งหมดที่มีชื่อ.อยู่ในนั้น
Rinzwind

10
@Rinzwind อย่างแม่นยำยิ่งขึ้นเครื่องหมายดอกจันหมายถึง "ศูนย์หรือมากกว่าของตัวละครใด ๆ " ดังนั้น*a*หมายถึงอักขระที่เป็นศูนย์หรือมากกว่าตามด้วยaตามด้วยอักขระศูนย์หรือมากกว่า มันจะตรงกับชื่อไฟล์happy, apple, หรือa la
DisgruntledGoat

7
@ user784637 คุณประทับใจเกินไป
Barlop

1
นี่คือคำสั่งที่คุณต้องการ: rm - *
anon58192932

168
  • วิธีลบโฟลเดอร์ที่มีเนื้อหาทั้งหมด ( รวมถึงโฟลเดอร์ภายในทั้งหมด ):

    rm -rf /path/to/directory
    
  • หากต้องการลบเนื้อหาทั้งหมดของโฟลเดอร์ ( รวมถึงโฟลเดอร์ภายในทั้งหมด ) แต่ไม่รวมถึงโฟลเดอร์:

    rm -rf /path/to/directory/*
    

    หรือ

    rm -rf /path/to/directory/{*,.*}
    

    หากคุณต้องการแน่ใจว่าไฟล์ / ไดเรกทอรีที่ซ่อนอยู่นั้นถูกลบด้วย

  • ในการลบ "ไฟล์" ทั้งหมดออกจากภายในโฟลเดอร์ ( ไม่ลบโฟลเดอร์ภายใน ):

    rm -f /path/to/directory/{*,.*}
    


  • คำเตือน : หากคุณมีช่องว่างในเส้นทางของคุณให้ใช้เครื่องหมายคำพูดเสมอ

    rm -rf /path/to the/directory/*
    

    เทียบเท่ากับการrm -rfโทรแยกกัน 2 สาย:

    rm -rf /path/to
    rm -rf the/directory/*
    

    เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้'เครื่องหมายคำพูดเดี่ยว'( ไม่ขยายตัวแปรเชลล์) หรือ"เครื่องหมายคำพูดคู่"( ขยายตัวแปรเชลล์):

    rm -rf "/path/to the/directory/"*
    


ที่ไหน:

  • rm- ย่อมาจาก " remove "
  • -f- ย่อมาจาก " force " ซึ่งมีประโยชน์เมื่อคุณไม่ต้องการให้ถาม / ถามหากคุณต้องการลบไฟล์เก็บถาวร
  • -r- ย่อมาจาก " recursive " ซึ่งหมายความว่าคุณต้องการลบไฟล์ซ้ำทุกโฟลเดอร์และลบทุกอย่างออก

8
ฉันพบว่านี่เป็นคำตอบที่ครอบคลุมและเป็นประโยชน์มากกว่าคำตอบที่ทำเครื่องหมายว่ายอมรับแล้ว
แรงบันดาลใจ

2
rm -rf /path/to/directory/*.htaccessไม่ลบไฟล์ที่ซ่อนอยู่ในเช่นโฟลเดอร์ อาจจะrm -rf /path/to/directory/.? ยังไม่ได้ลอง
Mark Berry

@Markberry rm -rf /path/to/directory/.*
Lilian A. Moraru

@ LilianA.Moraru ฉันทำการทดสอบวันนี้ rm -rf /path/to/directory/.*ลบเฉพาะไฟล์ที่ซ่อนอยู่ในไดเรกทอรีที่ระบุเท่านั้น มองไปที่ความคิดเห็นของ @ danjjl บน @ คำตอบ Rinzwind ของการลบไฟล์ที่ซ่อนอยู่เรียกใช้ก่อนที่จะใช้shopt -s dotglob rm -rf /path/to/directory/*
Mark Berry

ข้อควรระวัง: ในระบบของฉันที่เกิดจากการลบรายการในrm -rf /path/to/directory/.* /path/toโชคดีที่ฉันเพิ่งสำรองข้อมูลทั้งหมดของฉันไปยังดิสก์ที่แยกต่างหาก ไม่จำเป็นต้องพูดออกคำสั่งrm -rf /path/to/directory/.*เว้นแต่คุณจะสำรองข้อมูลคอมพิวเตอร์ทั้งหมดของคุณไปยังตำแหน่งที่แยก / ปลอดภัย!
ฏหมาย

43

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

rm -rf /path/to/directory/{*,.*}

1
นี่ควรเป็นคำตอบที่สวยงาม ขอขอบคุณ!
Nam G VU

3
ไม่กลมนี้ตรงกับ "." และ ".. " ด้วยหรือไม่
hertzsprung

4
@hertzsprung - มันไม่และมันจะทำให้คุณเตือนว่ามันไม่สามารถลบ./และ../แต่ก็ยังจะลบไฟล์ที่ซ่อนอยู่
Ryan Wheale

สิ่งนี้ไม่ทำงานบนคอนโซล Mac ไฟล์ที่ซ่อนอยู่ยังคงอยู่ในบรรทัดคำสั่งนั้น
agapitocandemor

วิธีลบทุกอย่างในไดเรกทอรีปัจจุบัน:rm -r $(pwd)/{*,.*}
Jimmy Adaro

10

หากคุณต้องการลบเฉพาะไฟล์ใน / path / to / directory คุณสามารถทำได้

find /path/to/directory -type f -print0| xargs -0 rm 

หรือ

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

คุณสามารถโหลดด้วยfindข้อดีคือคุณสามารถแสดงรายการสิ่งที่พบโดยไม่ต้องไปป์เพื่อrmให้คุณสามารถดูสิ่งที่จะถูกลบก่อนที่จะเริ่ม


2
GNU findเป็นภาค-deleteแสดง หากคุณยังต้องการใช้การ-execแทนที่\;ด้วย+จะรวบรวมrmสายเข้าด้วยกันเพื่อเพิ่มประสิทธิภาพ
enzotib

1
ไฟล์จำนวนมากที่มี '+' จะทำให้เกิดปัญหาเนื่องจากรายการจะใหญ่เกินไปเหมือนกับ rm -f * และเมื่อลบไฟล์จำนวนมากออกจากโฟลเดอร์เดียวกัน (การพูดคุยเป็นมิลลิวินาที) ทั้งสองไฟล์นั้นไม่ดี :) ในที่สุด C ++ ก็มาพร้อมกับลบไฟล์ตามลำดับของ inodes ใน dir-tree
Osis

3
คุณควรเพิ่ม a - after the rm หากปราศจากว่าคุณมีชื่อไฟล์ -rf หรือคล้ายกันจะถูกตีความเป็นอาร์กิวเมนต์ของ rm เช่น xargs -0 rm - หรือ -exec rm - {} \;
Richm

คุณยังสามารถระบุอาร์กิวเมนต์ -n ให้กับ xargs ที่จะทำให้มันแยกคำสั่ง rm ให้มีจำนวนอาร์กิวเมนต์สูงสุดเช่น 'xargs -n 100 -0 rm -' จะลบไฟล์ในหน่วยจำนวน 100
Richm

1
คุณยังสามารถเพิ่ม -maxdepth 1 เพื่อให้แน่ใจว่าการค้นหาไม่ส่งคืนไฟล์จากไดเรกทอรีย่อยใด ๆ ie find / path / to / directory -maxdepth 1 -type f
Richm

7

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

  • ลบโฟลเดอร์จากนั้นสร้างใหม่

    rm -rf dir_name && mkdir dir_name
    
  • ใช้ find

    find dir_name -mindepth 1 -delete  
    

ที่นี่เราระบุ-mindepth 1เพื่อแยกไดเรกทอรี dir_name เอง
ลองดูที่ลิงค์ต่อไปนี้:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory


ขอบคุณสำหรับคำแนะนำของคุณและฉันได้เพิ่มคำอธิบายเพิ่มเติมสำหรับลิงก์
zeekvfu

3
ระวังเนื่องจากการลบและสร้างโฟลเดอร์ใหม่อาจส่งผลให้เกิดการอนุญาตที่ไม่ถูกต้องสำหรับโฟลเดอร์นี้!
einjohn

6

rm -rf /path/to/directoryหากคุณยังต้องการที่จะลบไดเรกทอรีย่อยทั้งหมดและไดเรกทอรีตัวเองคุณสามารถใช้ แต่ตรวจสอบสายของคุณอีกครั้งก่อนกดกลับเสมอrm -rfอาจทำให้เกิดความยุ่งเหยิงมากมายเช่นถ้าคุณเผลอแทรกช่องว่างหลังจากสแลชแรกในขณะที่มีสิทธิ์ superuser ...


1

เนื่องจากคำถามนี้อยู่ด้านบนของ Google อย่างต่อเนื่องเมื่อฉันค้นหาด้วยตัวเอง:

คำตอบอื่น ๆ ประสบปัญหาที่แตกต่าง:

  1. บางคนรวมถึง.และ..ที่มีเสียงดังสับสนและน่ารำคาญ

  2. บางคนลืมไฟล์ที่ซ่อน (ไฟล์ที่ขึ้นต้นด้วยจุด)

  3. พวกเขาจะไม่ลบในลำดับที่ถูกต้อง (ลึกที่สุดก่อน) เพื่อให้การลบไดเรกทอรี

  4. พวกเขาลงไปในระบบไฟล์อื่น ๆ (ติดตั้ง) ซึ่งมักจะไม่พึงประสงค์

  5. พวกมันขยายได้ยากด้วยพารามิเตอร์พิเศษ (เพิ่มเติมจากด้านล่าง)

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

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

โปรดทราบว่าฉันได้เพิ่มการ-xdevโต้แย้งเพื่อป้องกันไม่ให้ลงไปในเมานท์ (เช่น/procฯลฯ )

ทำไมไม่-depthหรือ-delete?

แม้จะมีคนลงคะแนนฉันอย่างต่อเนื่องสำหรับวิธีการเหล่านี้มีข้อเสีย: ดูเหมือนว่าพวกเขาไม่สามารถขยายพอที่จะอนุญาตให้-pruneไดเรกทอรีย่อย (โดยไม่ต้องแนะนำปัญหาเพิ่มเติม) ตรงกันข้ามกับวิธีนี้คุณสามารถแทรก

-not \( -path "${DIR}/subdir" -prune \)

ก่อนที่-mindepthอาร์กิวเมนต์จะแยกsubdirออกจากการลบเนื้อหา


และสำหรับการสั่งซื้อครั้งแรกที่ลึกมี-depthธงในfindการที่
Sergiy Kolodyazhnyy

เอ่อ ... ทำไมไม่ลองใช้-deleteด้วยfindล่ะ? -deleteคือความลึกก่อน คุณได้สมมติว่าไม่ใช่ POSIX findด้วย-printfดังนั้นคุณอาจใช้-deleteหรือ-depth -print0 | xargs -0 rm
muru

@muru: เพราะฉันไม่รู้ดีกว่า ... ฉันจะเปลี่ยนมัน
Mehrdad

@muru: อันที่จริงดูเหมือนว่าวิธีการของคุณไม่ทำงานกับ-not \( -path "$DIR/subdir" \)... แต่ฉันจะทำอย่างไร ทำไม?
Mehrdad

@ Mehrdad สิ่งที่ควรทำ?
muru

0

คุณสามารถcdเข้าไปในไดเรกทอรีแล้วเรียกใช้คำสั่งrm *.*เหมือนกับใน DOS ถ้าคุณจำได้


1
DOS คือ DEL สำหรับไฟล์และ RMDIR สำหรับไดเรกทอรีที่ว่างเปล่าและไฟล์ที่ซ่อนอยู่และไฟล์ระบบจะต้องลบแอตทริบิวต์ ATTRIB เหล่านั้นออกก่อน ไม่ง่ายอย่างนั้น;)
Eric

0

หากต้องการลบไดเรกทอรีปัจจุบันคุณสามารถใช้ตัวอย่างเช่น rm -d ./*

-d บอกให้ลบไดเรกทอรีเช่นกัน

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