ด้วย GNU หรือ FreeBSD หรือ NetBSD หรือ OpenBSD (และอื่น ๆ ที่อาจเกิดขึ้น) awk
:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
จะดูที่บรรทัดแรกของแต่ละไฟล์เท่านั้นและจะเรียกใช้จำนวนน้อยawk
ที่สุดเท่าที่จำเป็น
nextfile
คำสั่งดังกล่าวไม่ได้มาตรฐาน แต่ที่พบในการใช้งานไม่กี่รวมทั้ง GNU หนึ่ง (ซึ่งอาจจะเป็นที่ที่มันมาจาก)
ในขณะที่รหัสด้านบนจะปรากฏขึ้นเพื่อใช้งานในการใช้งานอื่น ๆ เช่นกันnextfile
คำสั่งจะไม่ทำอะไรที่นั่น (จะได้รับการยอมรับว่าเป็นนิพจน์ที่ประกอบด้วยnextfile
ตัวแปรที่ไม่ได้ตั้งค่า) ดังนั้นนั่นหมายความว่าไฟล์ทั้งหมดจะถูกอ่านอย่างสมบูรณ์ พิมพ์สำหรับทุกบรรทัดที่ตรงกัน
หากการawk
สนับสนุนของคุณFNR
(เช่น POSIX awks ทำ แต่ไม่ใช่ต้นฉบับawk
ดังนั้นบน Solaris /usr/xpg4/bin/awk
และไม่ใช่/usr/bin/awk
) และไม่ใช่nextfile
คุณสามารถเขียนได้:
find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
ซึ่งยังคงทำงานน้อยawk
ที่สุดเท่าที่จะเป็นไปได้ แต่จะอ่านไฟล์ทั้งหมด
อีกหนึ่งทางเลือกที่จะหลีกเลี่ยงการอ่านไฟล์ได้อย่างเต็มที่และที่จะทำงานร่วมกับทุกคนawk
และfind
แต่จะหมายถึงการทำงานอย่างใดอย่างหนึ่งawk
ต่อไฟล์จะเป็น:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -l
จะหยุดอ่านไฟล์ทันทีที่พบการแข่งขันสำหรับไฟล์ที่ไม่มีข้อมูลตรงกันมันจะอ่านไฟล์ทั้งหมด นอกจากนี้ยังจะพบการจับคู่ที่ตรงกลางไฟล์เช่นสามารถจับคู่shar
ไฟล์ที่มีสคริปต์ไพ ธ อนได้