ฉันพยายามลบไฟล์ที่ขึ้นต้นด้วย 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