มีสองวิธีแก้ปัญหาสำหรับเรื่องนี้ โดยทั่วไปใช้หรือxargsparallel
xargs วิธีการ:
คุณสามารถใช้xargsกับfindดังนี้:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
คุณจะแทนที่number_of_processesด้วยจำนวนกระบวนการสูงสุดที่คุณต้องการเปิดใช้ อย่างไรก็ตามสิ่งนี้ไม่รับประกันว่าจะให้ประสิทธิภาพที่สำคัญในกรณีที่ประสิทธิภาพของคุณคือ I / O จำกัด ในกรณีนี้คุณอาจลองเริ่มกระบวนการเพิ่มเติมเพื่อชดเชยเวลาที่เสียไปที่รอ I / Os
นอกจากนี้เมื่อรวมการค้นหาคุณสามารถระบุตัวเลือกขั้นสูงเพิ่มเติมแทนรูปแบบไฟล์เช่นเวลาการแก้ไข ฯลฯ ...
ปัญหาที่เป็นไปได้อย่างหนึ่งในแนวทางนี้ตามที่อธิบายโดยความคิดเห็นของStéphaneหากมีไฟล์ไม่กี่ไฟล์xargsอาจไม่เริ่มกระบวนการหลายอย่างเพียงพอสำหรับพวกเขา ทางออกหนึ่งคือการใช้-nตัวเลือกสำหรับxargsระบุจำนวนอาร์กิวเมนต์ที่ควรใช้จากไพพ์ในแต่ละครั้ง การตั้งค่า-n1จะบังคับxargsให้เริ่มกระบวนการใหม่สำหรับแต่ละไฟล์ นี่อาจเป็นพฤติกรรมที่ต้องการหากไฟล์มีขนาดใหญ่มาก (เช่นในกรณีของคำถามนี้) และมีจำนวนไฟล์ค่อนข้างน้อย อย่างไรก็ตามหากไฟล์มีขนาดเล็กค่าใช้จ่ายในการเริ่มต้นกระบวนการใหม่อาจบ่อนทำลายความได้เปรียบของการขนานซึ่งในกรณีนี้-nค่าที่มากกว่าจะดีกว่า ดังนั้น-nตัวเลือกอาจปรับละเอียดตามขนาดและหมายเลขไฟล์
วิธีการแบบขนาน:
อีกวิธีในการทำคือใช้เครื่องมือ Ole Tange GNU Parallel parallel(มีให้ที่นี่ ) สิ่งนี้นำเสนอการควบคุมเกรนละเอียดยิ่งขึ้นสำหรับการขนานและยังสามารถกระจายไปยังหลาย ๆ โฮสต์ได้ (จะเป็นประโยชน์ถ้าไดเรกทอรีของคุณถูกแชร์เช่นกัน) ไวยากรณ์ที่ง่ายที่สุดโดยใช้ขนานจะเป็น:
find . -type f | parallel -j+1 grep mypattern
เมื่อตัวเลือก-j+1สั่งให้ขนานเพื่อเริ่มต้นกระบวนการหนึ่งเกินจำนวนแกนบนเครื่องของคุณ (สิ่งนี้มีประโยชน์สำหรับงาน I / O ที่ จำกัด คุณอาจลองเพิ่มจำนวนมากขึ้น)
Parallel ยังมีข้อได้เปรียบเหนือxargsการรักษาลำดับของเอาต์พุตจากแต่ละกระบวนการและสร้างเอาต์พุตที่ต่อเนื่องกัน ตัวอย่างเช่นxargsหากกระบวนการ 1 สร้างบรรทัดพูดp1L1กระบวนการที่ 2 สร้างบรรทัดp2L1กระบวนการ 1 สร้างบรรทัดอื่นp1L2ผลลัพธ์จะเป็น:
p1L1
p2L1
p1L2
ในขณะparallelที่ผลลัพธ์ควรเป็น:
p1L1
p1L2
p2L1
ซึ่งมักจะมีประโยชน์มากกว่าxargsเอาท์พุท