ฉันจะลบไฟล์ทั้งหมดของส่วนขยายเฉพาะในไดเรกทอรีปัจจุบันซ้ำ ๆ ได้อย่างไร


531

ฉันจะลบไฟล์ทั้งหมดอย่างปลอดภัยด้วยนามสกุลเฉพาะ (เช่น.bak) จากไดเรกทอรีปัจจุบันและโฟลเดอร์ย่อยทั้งหมดโดยใช้บรรทัดคำสั่งเดียวได้อย่างไร เพียงแค่ฉันกลัวที่จะใช้rmเนื่องจากฉันใช้ผิดครั้งเดียวและตอนนี้ฉันต้องการคำแนะนำ

คำตอบ:


840

คุณไม่จำเป็นต้องใช้rmในกรณีนี้ถ้าคุณกลัว การใช้find:

find . -name "*.bak" -type f -delete

แต่ใช้ด้วยความระมัดระวัง เรียกใช้ก่อน:

find . -name "*.bak" -type f

เพื่อดูว่าคุณจะลบไฟล์ใด

นอกจากนี้ตรวจสอบให้แน่ใจว่า-deleteเป็นอาร์กิวเมนต์สุดท้ายในคำสั่งของคุณ หากคุณใส่มันก่อน-name *.bak argument, มันจะลบทุกอย่าง

ดูman findและman rmสำหรับข้อมูลเพิ่มเติมและดูคำถามที่เกี่ยวข้องนี้ใน SE:


สิ่งนี้แตกต่างจากrm *.bakอย่างไร
sayantankhan

10
@ Bolt64 คุณrm *.bakจะไม่ทำงานสำหรับไดเรกทอรีย่อย
Radu Rădeanu

ด้วยการตั้งค่าเริ่มต้นrm *.bakจะลบไฟล์ทั้งหมดที่ลงท้ายด้วย. bak ในไดเรกทอรีปัจจุบันเท่านั้น เมื่อต้องการทำสิ่งต่าง ๆ ในไดเรกทอรีย่อยที่คุณต้องการทำซอกับ globs ใช้ตัวเลือก -r หรือใช้ตัวอย่างการค้นหา
Hennes

9
@Hennes ระวังด้วยrm -r *.bak! นอกจากนี้ยังลบไดเรกทอรีที่ลงท้าย.bakด้วยเนื้อหาทั้งหมด
Radu Rădeanu

37
ตรวจสอบให้แน่ใจว่า-deleteเป็นอาร์กิวเมนต์สุดท้ายในคำสั่งของคุณ หากคุณใส่ไว้หน้า-name *.bakอาร์กิวเมนต์มันจะลบทุกอย่าง
Michael

40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

1
ยินดีต้อนรับสู่ askubuntu! ขณะนี้เป็นคำตอบที่ถูกต้องสมบูรณ์ผมไม่คิดว่ามีประโยชน์ใด ๆ ในการใช้นี้แทนที่จะเป็นธงชาติ-delete findข้อมูลเพิ่มเติมสามารถพบได้ในGNU คู่มือรายการสำหรับการลบไฟล์ที่มีการค้นพบ
Glutanimate

2
คุณอาจจะถูกต้องก็เป็นเพียงการแก้ปัญหาทางเลือกที่อาจจะมากขึ้นดิบ;)
lokers

11
นี่ไม่ใช่แค่ทางเลือกอื่น แต่เป็นตัวอย่างว่าจะรวมคำสั่งอื่นเข้าด้วยกันกับไปป์ '|' ได้อย่างไร +1
Boris Pavlović

13
โซลูชันทางเลือกนี้ทำงานบนสภาพแวดล้อมอื่น ๆ ที่ไม่มี -delete (เช่น cygwin)
ciriarte

2
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดที่นี่
LéoLéopold Hertz 준영

33

เรียกใช้คำสั่งshopt -s globstarก่อน คุณสามารถเรียกใช้สิ่งนั้นได้ในบรรทัดคำสั่งและจะมีผลเฉพาะในหน้าต่างเชลล์นั้น คุณสามารถใส่มันลงไป.bashrcจากนั้นกระสุนที่เพิ่งเริ่มใหม่ทั้งหมดจะมารับมัน ผลของคำสั่งนั้นคือการ**/จับคู่ไฟล์ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยซ้ำ (โดยค่าเริ่มต้น**/หมายถึงสิ่งเดียวกับ*/: เฉพาะในไดเรกทอรีย่อยทันที) แล้ว:

rm **/*.bak

(หรือgvfs-trash **/*.bakสิ่งที่คุณมี)


21

การลบไฟล์สำหรับฉันสิ่งที่คุณไม่ควรใช้rmสำหรับ นี่คือทางเลือก:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

ในฐานะที่เป็น Flimm ระบุในความคิดเห็น:

แพ็คเกจtrash-cliทำสิ่งเดียวกันgvfs-trashโดยไม่มีการพึ่งพา gvfs

ดังนั้น:

sudo apt-get install trash-cli

คุณไม่จำเป็นต้องสร้างนามแฝงสำหรับสิ่งนี้เนื่องจากtrash-cliแพ็คเกจให้คำสั่งtrashซึ่งทำสิ่งที่เราต้องการ

เมื่อเอลียาห์คาเกนแสดงความคิดเห็นอย่างละเอียดคุณสามารถใช้การเรียกซ้ำfindนี้ ในกรณีนี้คุณไม่สามารถใช้นามแฝงได้ดังนั้นคำสั่งด้านล่างจะถือว่าคุณได้ติดตั้งtrash-cliแล้ว ฉันสรุปความคิดเห็นของ Eliah:

คำสั่งนี้ค้นหาและแสดง.bakไฟล์และ symlink ทั้งหมดที่ใดก็ได้ในไดเรกทอรีปัจจุบันหรือไดเรกทอรีย่อยหรือด้านล่าง

find . -name '*.bak' -xtype f

เพื่อที่จะลบผนวก-execกับtrashคำสั่ง:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype fเลือกไฟล์และ symlink ไปยังไฟล์ แต่ไม่ใช่โฟลเดอร์ หากต้องการลบโฟลเดอร์. bak ให้ลบส่วนนั้นออกและใช้-execdirเพื่อหลีกเลี่ยงcannot trash non-existentข้อผิดพลาดสำหรับ.bakไฟล์ภายใน.bakไดเรกทอรี:

find . -name '*.bak' -execdir trash {} +

4
"อย่าใช้rmเพื่อลบสิ่งต่าง ๆ " เป็นคำโต้เถียง แต่ฉันต้องยอมรับว่ามันฉลาดกว่าที่จะใช้สิ่งที่จะทำให้คุณเลิกทำ
Oli

2
แพคเกจtrash-cliจะเป็นสิ่งเดียวกันเป็นได้โดยไม่ต้องพึ่งพาgvfs-trash gvfs
Flimm

ฉันได้แก้ไขมันในคำตอบครั้งต่อไปที่จะแก้ไขด้วยตัวเอง
don.joey

@ don.joey คำตอบนี้ดูเหมือนว่าfind . -name "*.bak" -type fจะแสดงสิ่งที่ถูกtrash *.bakลบ นั่นคือสิ่งที่คุณหมายถึงจริงเหรอ? คุณสามารถย้ายไดเรกทอรีไปยังถังขยะด้วยtrashหรือgvfs-trashแต่trash *.bakจะย้ายเฉพาะไฟล์และไดเรกทอรีที่มีชื่อลงท้ายด้วย.bakและอยู่ในไดเรกทอรีปัจจุบันทันที เปลือกขยาย*.bakดังนั้นtrash *.bakจะไม่ส่งผลกระทบต่อไฟล์ในไดเรกทอรีย่อยไม่ได้ว่าตัวเองชื่อ.bak .bak
Eliah Kagan

1
@ don.joey ใช่ls *.bak(ซึ่งฉันคิดว่าคุณหมายถึง) รายการสิ่งที่trash *.bakถังขยะ find . -name '*.bak' -xtype f -exec trash {} +ทิ้ง.bakไฟล์ทั้งหมดที่อยู่.ข้างใต้ ไม่สามารถใช้นามแฝงได้ดังนั้นควรติดตั้งtrash-cliหรือเขียนgvfs-trashแทน นี่คือตัวอย่าง -xtype fเลือกไฟล์และ symlink ไปยังไฟล์ แต่ไม่ใช่โฟลเดอร์ ในการลบ.bak โฟลเดอร์ด้วยให้ใช้find . -name '*.bak' -execdir trash {} +ซึ่งจะหลีกเลี่ยงcannot trash non existentข้อผิดพลาดสำหรับ.bakไฟล์ภายใน.bakไดเรกทอรี โปรดอย่าลังเลที่จะใช้สิ่งนี้ในคำตอบของคุณ
Eliah Kagan

5

หากคุณต้องการลบไฟล์ทั้งหมดบางประเภท แต่เพียง 1 โฟลเดอร์ "ลึก" จากโฟลเดอร์ปัจจุบัน:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2เนื่องจากไดเรกทอรีปัจจุบัน " . " นับเป็นโฟลเดอร์แรก


1

คำตอบที่รวดเร็ว:

  • ลบไฟล์ทั้งหมดด้วยชื่อที่พิจารณาหรือ postfix ซ้ำ:

    find . -name '*.pyc' -type f -delete

  • ลบไดเรกทอรีทั้งหมดที่มีชื่อที่พิจารณาซ้ำ:

    find ~ -path '*/__pycache__/*' -delete‍‍‍
    find ~ -type d -name '__pycache__' -empty -delete‍‍‍
    

    ควบคุมได้ค่อนข้างน้อย แต่ในบรรทัดเดียว:

    find ~ -path '*/__pycache__*' -delete
    

[ หมายเหตุ ]:

dเป็นตัวเลือกไดเรกทอรีและfเป็นตัวเลือกไฟล์


0

หากคุณอยู่ใน repo คอมไพล์คุณสามารถใช้:

git clean -fdx

นี่เป็นการลบไฟล์และไฟล์ที่ไม่ได้ติดตามใน. gitignore

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