ใช้ rm เพื่อลบไฟล์และไดเรกทอรีซ้ำ


17

เป็นไปได้ที่จะใช้ rm เพื่อลบไฟล์และไดเรกทอรีที่ตรงกับรูปแบบซ้ำโดยไม่ใช้คำสั่งอื่น ๆ ?

คำตอบ:


35

หากต้องการตอบคำถามของคุณโดยตรง "ไม่ - คุณไม่สามารถทำสิ่งที่คุณอธิบายด้วยrm"

คุณสามารถfindแต่คุณทำมันรวมกับ นี่คือหนึ่งในหลาย ๆ วิธีที่คุณสามารถทำได้:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

ตัวอย่างเช่นหากคุณต้องการดักฟังไฟล์ * ~ ทั้งหมดคุณสามารถทำได้ดังนี้:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

หากต้องการขยายจากความคิดเห็น* :

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm

1
จริง - ถ้าคุณปล่อยออกท่อสุดท้ายที่คุณจะได้รับรายชื่อของทุกอย่างเป็นครั้งแรก :)
วอร์เรน

2
อาจไม่ตอบคำถามของผู้โพสต์โดยตรง แต่เป็นสิ่งที่ใกล้เคียงที่สุดกับสิ่งที่พวกเขาต้องการ
Drakia

1
คนแคระนั่นไม่ใช่ความขมขื่นเล็กน้อยโดยไม่มีเหตุผลใช่ไหม
Gnoupi

10
find | grep | xargs rmโปรดใช้ความระมัดระวังมากในการใช้ หากมีไฟล์ที่มีช่องว่าง (หรือขึ้นบรรทัดใหม่) สิ่งนี้จะแตก (และขึ้นอยู่กับชื่อไฟล์และตำแหน่งที่ว่าง) อาจลบสิ่งที่คุณไม่ต้องการลบ find … -print0 | xargs -0 rmจะแข็งแกร่งมากขึ้น อย่างไรก็ตามคุณจะไม่สามารถใช้grepและต้องใช้เพรดิเคตfindของเพื่อจับคู่และพิมพ์เฉพาะไฟล์ที่ต้องการ find -type f -name '*~' -print0 | xargs -0 rmตัวอย่างที่สองของกระต่ายจะมีประสิทธิภาพมากขึ้นเป็น
344 Chris

1
หากคุณต้องการให้คำสั่งเดียวทำงานให้สร้างนามแฝงโดยใช้หนึ่งในคำสั่ง find ที่ระบุ จะกรอกคำตอบสำหรับสิ่งนี้ในภายหลังหากต้องการ
ชั่วคราว

8

"โดยไม่ใช้คำสั่งอื่น"

เลขที่


คำตอบที่ดีซึ่งแสดงให้เห็นถึงการ "ตอบคำถามเริ่มต้นอย่างเคร่งครัด (ที่มีความเสี่ยงที่จะไม่สามารถหาทางออกได้)" กับ "เสนอวิธีแก้ปัญหาแม้ว่าจะไม่ตรงกับข้อ จำกัด ที่กำหนดไว้อย่างเคร่งครัดก็ตาม"
Gnoupi

ฉันเพิ่งโพสต์สิ่งนี้เป็น "คนแคระ" กำลังบ่นเกี่ยวกับคำตอบที่ให้วิธีแก้ปัญหา หากไม่มีการใช้คำสั่งอื่น ๆ จะไม่มีวิธีการลบไฟล์แบบเรียกซ้ำที่ตรงกับรูปแบบเพียงแค่การลบไฟล์ / ไดเรกทอรีไดเรกทอรีปัจจุบัน
Drakia

3

ใช้ Bash พร้อมglobstarชุดใช่ :

rm basedir/**/my*pattern*

ลองกับตัวอย่างls -1ก่อนก่อนrmเพื่อแสดงรายการไฟล์ที่คุณต้องการ

shopt -s globstarคุณตั้งค่าตัวเลือกผ่านเช่น


อีกทางเลือกหนึ่งคือfindตัวแปรที่สั้นกว่า:

find -type f -name 'my*pattern*' -delete

หรือสำหรับ GNU find:

find -type f -name 'my*pattern*' -exec rm {} +

หรือทางเลือกอื่นสำหรับผู้ที่ไม่ใช่ GNU find(ช้ากว่าเล็กน้อย):

find -type f -name 'my*pattern*' -exec rm {} \;

หากต้องการลบไดเรกทอรีตามที่คุณขอให้เพียงเปลี่ยนrmเป็นrm -rคำสั่งด้านบนและข้ามการจับคู่เฉพาะ-type fในfindคำสั่งเท่านั้น


0

ฉันจะได้ asuumed "rm -rf" ซึ่งเป็นการรวมกันของชื่อไฟล์และรูปแบบการจับคู่เช่น * และ? ฯลฯ (เช่น todays_log_2009 ????. บันทึก) ซึ่งจะเริ่มจาก Dir ปัจจุบันและทำงานซ้ำ ๆ เพื่อลบไฟล์ที่มีรูปแบบดังกล่าว


สิ่งนี้จะไม่ทำงานเนื่องจากรูปแบบถูกขยายโดยเชลล์ในไดเรกทอรีปัจจุบัน หากยกมารูปแบบจะกลายเป็นชื่อไฟล์ที่มีอักขระพิเศษอยู่ในนั้น เช่นเพื่อลบไฟล์ [สามารถเขียน rm '[' ได้ รูปแบบก็สูญเสียความหมายของมัน
ชั่วคราว

0

หากคุณใช้zsh (1)ให้เปิด "Extended globbing" ด้วยsetopt extendedglobใน. zshrc คำนำหน้ารูปแบบด้วย '** /' จะลบแบบเรียกซ้ำ:

% rm -rf ** / <pattern>

อย่างไรก็ตามหากมีไฟล์จำนวนมากที่จะลบคุณควรหันไปหา (1)ด้วยxargs (1)หรือ -exec และฉันก็แนะนำให้ทำเช่นนั้นในเชลล์สคริปต์

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