มีสองวิธีแก้ปัญหาสำหรับเรื่องนี้ โดยทั่วไปใช้หรือxargs
parallel
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
เอาท์พุท