ท่อ (|
) เชื่อมต่อสตรีมเอาต์พุตมาตรฐานของกระบวนการเข้ากับสตรีมอินพุตมาตรฐานของกระบวนการอื่น คุณไม่สามารถใช้สิ่งนั้นเพื่อส่งรายชื่อไฟล์ไปให้ 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
ตรงกับเพรดิเคต แต่ดูเหมือนจะไม่จำเป็นที่นี่)
ดูสิ่งนี้ด้วย ทำไม ไม่ แยกวิเคราะห์ ล
(และจะทำอย่างไรแทน)?