ฉันพยายามลบไฟล์ที่ขึ้นต้นด้วย A และลงท้ายด้วยตัวเลข 2 ตัว แต่ไม่ได้ทำอะไรเลย
สิ่งที่ฉันพยายาม:
rm ^A*[0..9]2$
ฉันผิดตรงไหน
ฉันพยายามลบไฟล์ที่ขึ้นต้นด้วย A และลงท้ายด้วยตัวเลข 2 ตัว แต่ไม่ได้ทำอะไรเลย
สิ่งที่ฉันพยายาม:
rm ^A*[0..9]2$
ฉันผิดตรงไหน
คำตอบ:
คุณสามารถใช้คำสั่งต่อไปนี้เพื่อลบไฟล์ทั้งหมดที่ตรงกับเกณฑ์ของคุณ:
ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm
มันทำงานอย่างไร:
ls แสดงรายการไฟล์ทั้งหมด (ทีละบรรทัดเนื่องจากผลลัพธ์ถูกไพพ์)
grep -P "^A.*[0-9]{2}$" กรองรายการไฟล์และปล่อยเฉพาะไฟล์ที่ตรงกับนิพจน์ทั่วไป ^A.*[0-9]{2}$
.*ระบุจำนวนครั้งที่เกิดขึ้น.ซึ่ง.เป็นสัญลักษณ์แทนการจับคู่อักขระใด ๆ
[0-9]{2}ระบุว่าเกิดขึ้นสองครั้ง[0-9]นั่นคือตัวเลขใด ๆ
xargs -d"\n" rmดำเนินการrm lineหนึ่งครั้งสำหรับทุกlineสิ่งที่ส่งไป
ฉันผิดตรงไหน
สำหรับผู้เริ่มrmไม่ยอมรับการแสดงออกปกติเป็นอาร์กิวเมนต์ นอกจากสัญลักษณ์ตัวแทน*แล้วตัวละครทุกตัวจะได้รับการปฏิบัติอย่างแท้จริง
นอกจากนี้การแสดงออกปกติของคุณจะปิดเล็กน้อย ยกตัวอย่างเช่น*หมายถึงเหตุการณ์ใด ๆ...ในการแสดงออกปกติดังนั้นA*การแข่งขันA, AAฯลฯ และแม้กระทั่งสตริงที่ว่างเปล่า
-d"\nสวิทช์แก้ไขปัญหาช่องว่าง
grep -P(Perl regex) grep -Eอาจทำงานได้ในกรณีนี้
-Iกับxargsและทดสอบด้วยคำสั่งที่ไม่ร้ายแรงก่อนเสมอ:xargs -d"\n" -I {} echo "{}"
หรือใช้find:
find your-directory/ -name 'A*[0-9][0-9]' -delete
วิธีการแก้ปัญหานี้จะจัดการกับชื่อไฟล์แปลก ๆ
-type f
xargs rm -f
ดูส่วนขยายชื่อไฟล์ของหน้าคนทุบตี:
rm A*[0-9][0-9]
โซลูชันที่มี regexp ดีกว่า 200 เท่าแม้คุณจะเห็นว่าไฟล์ใดที่จะถูกลบก่อนที่จะใช้คำสั่งโดยตัดท่อสุดท้าย:
ls | grep -P "^A.*[0-9]{2}$"
ถ้ามันถูกต้องก็ใช้:
ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm
นี่จะดีกว่า 200 เท่าเพราะถ้าคุณทำงานกับ Unix คุณจำเป็นต้องรู้วิธีใช้ grep มีประสิทธิภาพมากถ้าคุณรู้วิธีใช้งาน
สิ่งนี้ใช้ได้กับ mac ของฉัน:
rm $(ls | grep -e '^A*[0..9]2$')
find คำสั่งทำงานกับ regexes เช่นกัน
ตรวจสอบว่าจะลบไฟล์ใด
find . -regex '^A.*[0-9]{2}$'
ลบไฟล์
find . -regex '^A.*[0-9]{2}$' -delete