ฉันจะลบหลายไฟล์ด้วยคำนำหน้าและคำต่อท้ายทั่วไปได้อย่างไร


21

ฉันมีชื่อไฟล์มากมาย

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

และชื่อไฟล์

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

และชื่อไฟล์

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

และ

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

ฉันต้องการลบไฟล์ที่ขึ้นต้นด้วย 'sequence_1' และลงท้ายด้วย '.hmf' แต่ฉันไม่ต้องการลบทีละไฟล์เนื่องจากมีไฟล์หลายพันไฟล์ ฉันจะระบุคำสั่ง rm ที่ฉันต้องการลบทั้งหมดที่เริ่มต้นด้วย prefilx 'sequence_1' และสิ้นสุดใน '.hmf' ได้อย่างไร

ขณะนี้ฉันกำลังทำงานกับระบบ RedHat Linux แต่ฉันต้องการทราบวิธีการทำในการกระจายอื่น ๆ เช่นกัน

คำตอบ:


28
rm sequence_1*.hmf

ไฟล์เอาเริ่มต้นด้วยและลงท้ายด้วย sequence_1.hmf


Globbing เป็นกระบวนการที่เชลล์ของคุณใช้รูปแบบและขยายเข้าไปในรายการชื่อไฟล์ที่ตรงกับรูปแบบนั้น อย่าสับสนกับการแสดงออกปกติซึ่งแตกต่างกัน หากคุณใช้เวลาส่วนใหญ่ในbashการ Wooledge วิกิพีเดียมีดีหน้า globbing (ส่วนขยายชื่อพา ธ ) หากคุณต้องการความสะดวกในการพกพาสูงสุดคุณจะต้องอ่านข้อกำหนดPOSIX ในการจับคู่รูปแบบด้วย / แทน


ในกรณีที่ไม่น่าเป็นไปได้ที่คุณพบข้อผิดพลาด"รายการอาร์กิวเมนต์ยาวเกินไป"คุณสามารถดูBashFAQ 95ซึ่งจัดการเรื่องนี้ได้ วิธีแก้ปัญหาที่ง่ายที่สุดคือการแบ่งรูปแบบกลมเป็นชิ้นเล็ก ๆ หลาย ๆ จนกว่าข้อผิดพลาดจะหายไป ในกรณีของคุณคุณอาจหลีกเลี่ยงการแยกการแข่งขันด้วยตัวเลขนำหน้า 0 ถึง 9 ดังนี้:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case

นี่เป็นวิธีที่ฉลาดมากในการแก้ไขข้อผิดพลาด 'รายการอาร์กิวเมนต์ที่ยาวเกินไป' ในกรณีของฉันฉันมีสองหมื่นไฟล์ดังนั้นฉันเดาว่าฉันจะต้องใช้ a สำหรับวนซ้ำตั้งแต่ 0, .. , 20 ขวา?
พอล

@ พอลขวาเพียงแค่แบ่งรายการเป็นกลุ่มมากเท่าที่คุณต้องการถึงแม้ว่าในบางจุดfindวิธีกลายเป็นเรื่องง่ายกว่าที่คาดเดาและตรวจสอบ
jw013

14

แม้ว่าคำตอบของ jw013 นั้นถูกต้อง wrt globbing คำสั่งนั้นอาจล้มเหลวหากคุณมีไม้ขีดไฟนับพัน: บรรทัดคำสั่งที่rm sequence_1_0001.hmf sequence_1_0002.hmf ...สร้างโดยเชลล์อาจใหญ่เกินไป

ตามที่แนะนำ Dom คุณยังสามารถใช้-deleteตัวเลือกกับfind:

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

ทั้ง-maxdepthและ-deleteในขณะที่ไม่ได้อยู่ในมาตรฐาน POSIXนั้นค่อนข้างทั่วไปในfindการใช้งานในป่า ลีนุกซ์รุ่นลีนุกซ์ใช้ GNU find, ซึ่งรองรับตัวเลือกเหล่านั้นแน่นอน


2
หากคุณสามารถใช้ตัวเลือกการลบสำหรับการค้นหาก็ไม่ได้แยกสำหรับแต่ละไฟล์ ...
Dom

เพิ่มเสียงเชียร์ ดูเหมือนว่า-deleteควรได้รับการสนับสนุนในระบบGNU และ BSD ล่าสุดในขณะที่-print0เป็น GNU เท่านั้น ดังนั้นมันก็มีแนวโน้มที่จะพกพามากขึ้นด้วย (แม้ว่ามันจะไม่สร้างความแตกต่างให้กับ OP)
ไร้ประโยชน์

อย่างน้อยการค้นหาของ OS X มี -print0 แต่ไม่รวมอยู่ใน POSIX
Lri

5
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

ก็จะทำงานใน Bash ด้วยเช่นกัน


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