ลบไฟล์ที่มีการแสดงออกปกติ


40

ฉันพยายามลบไฟล์ที่ขึ้นต้นด้วย A และลงท้ายด้วยตัวเลข 2 ตัว แต่ไม่ได้ทำอะไรเลย
สิ่งที่ฉันพยายาม:

rm ^A*[0..9]2$

ฉันผิดตรงไหน

คำตอบ:


56

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อลบไฟล์ทั้งหมดที่ตรงกับเกณฑ์ของคุณ:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

มันทำงานอย่างไร:

  1. ls แสดงรายการไฟล์ทั้งหมด (ทีละบรรทัดเนื่องจากผลลัพธ์ถูกไพพ์)

  2. grep -P "^A.*[0-9]{2}$" กรองรายการไฟล์และปล่อยเฉพาะไฟล์ที่ตรงกับนิพจน์ทั่วไป ^A.*[0-9]{2}$

    • .*ระบุจำนวนครั้งที่เกิดขึ้น.ซึ่ง.เป็นสัญลักษณ์แทนการจับคู่อักขระใด ๆ

    • [0-9]{2}ระบุว่าเกิดขึ้นสองครั้ง[0-9]นั่นคือตัวเลขใด ๆ

  3. xargs -d"\n" rmดำเนินการrm lineหนึ่งครั้งสำหรับทุกlineสิ่งที่ส่งไป

ฉันผิดตรงไหน

สำหรับผู้เริ่มrmไม่ยอมรับการแสดงออกปกติเป็นอาร์กิวเมนต์ นอกจากสัญลักษณ์ตัวแทน*แล้วตัวละครทุกตัวจะได้รับการปฏิบัติอย่างแท้จริง

นอกจากนี้การแสดงออกปกติของคุณจะปิดเล็กน้อย ยกตัวอย่างเช่น*หมายถึงเหตุการณ์ใด ๆ...ในการแสดงออกปกติดังนั้นA*การแข่งขันA, AAฯลฯ และแม้กระทั่งสตริงที่ว่างเปล่า

สำหรับข้อมูลเพิ่มเติมโปรดเยี่ยมชมRegular-Expressions.info


3
ระวังช่องว่างในชื่อไฟล์
slhck

1
-d"\nสวิทช์แก้ไขปัญหาช่องว่าง
Frg

1
หมายเหตุ - distros บางตัว (เช่น Mac OS) ไม่มีgrep -P(Perl regex) grep -Eอาจทำงานได้ในกรณีนี้
bluescrubbie

1
ฉันชอบใช้-Iกับxargsและทดสอบด้วยคำสั่งที่ไม่ร้ายแรงก่อนเสมอ:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
กำลังแยกls? ดูคำถามนี้ซึ่งชี้ไปในบทความนี้ เนื่องจากข้อผิดพลาดคุณอาจจะได้rmสิ่งที่คุณไม่ต้องการ
Kamil Maciorowski

45

หรือใช้find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

วิธีการแก้ปัญหานี้จะจัดการกับชื่อไฟล์แปลก ๆ


4
นี่เป็นทางออกที่ดี ฉันชอบเพราะมันง่ายกว่าและคุณสามารถละเว้นแฟล็ก -delete ที่ท้ายก่อนเพื่อดูว่า regex ของคุณถูกต้องก่อนที่จะลบไฟล์จำนวนมากหรือไม่
JAMESSTONEco

1
นอกจากนี้คุณสามารถควบคุมสิ่งที่คุณลบได้มากขึ้นตัวอย่างเช่นการเพิ่ม-type f
Marco Sulla

สามารถใช้เพื่อลบไฟล์และโฟลเดอร์ได้หรือไม่? มันไม่ทำงานสำหรับโฟลเดอร์ที่ไม่ว่างเปล่า
อเล็กซ์

@ Alex Nope ไดเรกทอรีต้องว่างเปล่า (มันก็ไม่ได้เป็นความต้องการอยู่แล้ว OP), คุณสามารถใช้วิธีการที่มีxargs rm -f
cYrus

10

ดูส่วนขยายชื่อไฟล์ของหน้าคนทุบตี:

rm A*[0-9][0-9]

ทำงานได้ดีสำหรับฉัน
Nishanth Matha

นี่เป็นคำตอบที่ง่ายที่สุด แต่ยังครบถ้วนสำหรับคำถาม
Janac Meena

จะใช้งานได้หรือไม่หากโฟลเดอร์มีไฟล์จำนวนมาก
Itay

1

โซลูชันที่มี regexp ดีกว่า 200 เท่าแม้คุณจะเห็นว่าไฟล์ใดที่จะถูกลบก่อนที่จะใช้คำสั่งโดยตัดท่อสุดท้าย:

ls | grep -P "^A.*[0-9]{2}$"

ถ้ามันถูกต้องก็ใช้:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

นี่จะดีกว่า 200 เท่าเพราะถ้าคุณทำงานกับ Unix คุณจำเป็นต้องรู้วิธีใช้ grep มีประสิทธิภาพมากถ้าคุณรู้วิธีใช้งาน


1
นี่ไม่ได้เพิ่มอะไรมากไปกว่าคำตอบอายุ 4 ปีของเดนนิสแล้ว
8bittree

1
"200 ครั้ง" นั้นค่อนข้างเฉพาะเจาะจง คำสั่งอื่น ๆ จำนวนมากก็มีประสิทธิภาพเช่นกันสิ่งที่คุณต้องทำก็คือเรียนรู้วิธีใช้มัน
เกล็นแจ็คแมน


0

find คำสั่งทำงานกับ regexes เช่นกัน

ตรวจสอบว่าจะลบไฟล์ใด

find . -regex '^A.*[0-9]{2}$'

ลบไฟล์

find . -regex '^A.*[0-9]{2}$' -delete
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.