ท่อ (|) เชื่อมต่อสตรีมเอาต์พุตมาตรฐานของกระบวนการเข้ากับสตรีมอินพุตมาตรฐานของกระบวนการอื่น คุณไม่สามารถใช้สิ่งนั้นเพื่อส่งรายชื่อไฟล์ไปให้ rm โดยตรงเพราะ rm ไม่อ่านชื่อไฟล์จากอินพุตมาตรฐาน
คุณ สามารถ ใช้ xargs โปรแกรมสำหรับอ่านรายชื่อ ของมัน อินพุตมาตรฐาน และ "รวม" ชื่อไฟล์สำหรับ rm:
ls -A | grep abcdef | xargs rm
แต่อย่ามีปัญหาทุกประเภทกับแนวทางนี้ - โดยเฉพาะอย่างยิ่ง เกรป ประมวลผลอินพุตทีละบรรทัดในขณะที่ xargs แยกอินพุตบนช่องว่างตามค่าเริ่มต้น คุณสามารถทำให้ดีขึ้นได้โดยใช้สิ่งที่ชอบ
shopt -s dotglob # จำลอง ls -A ไฟล์ที่ซ่อนอยู่ "เกือบทั้งหมด"
พิมพ์f '%s\0' * | grep -z abcdef | xargs -0 rm
ซึ่งใช้อักขระ null ASCII เพื่อแยกชื่อไฟล์อย่างชัดเจน วิธีการที่นิยมโดยทั่วไปคือการใช้ หา สั่งการ:
หา . -maxความลึก 1 -ชื่อ '*abcdef*' # -ลบ
(ฉันออกจาก -ลบ แสดงความคิดเห็นสำหรับตอนนี้ - ตรวจสอบให้แน่ใจอย่างแน่นอน หาใช้ไฟล์ที่ถูกต้องก่อนที่จะยกเลิกการแสดงความคิดเห็น เนื่องจากไม่มีการดำเนินการ "เลิกทำ")
โปรดทราบว่า หา เรียกซ้ำในไดเร็กทอรีย่อยโดยค่าเริ่มต้น - หากคุณต้องการเทียบเท่า ls -R จากนั้นถอด -ความลึกสูงสุด 1. คุณสามารถเพิ่ม -ประเภทฉ เพื่อค้นหาและลบไฟล์เท่านั้น (ละเว้นไดเร็กทอรี)
โปรดทราบว่า ค้นหาชื่อ ใช้รูปแบบ shell glob แทนนิพจน์ทั่วไปที่ใช้โดย เกรป (นอกจากนี้ยังมี -regex ตรงกับเพรดิเคต แต่ดูเหมือนจะไม่จำเป็นที่นี่)
ดูสิ่งนี้ด้วย ทำไม ไม่ แยกวิเคราะห์ ล (และจะทำอย่างไรแทน)?