ค้นหาไฟล์ทั้งหมดด้วย Python Shebang


9

ฉันพยายามเรียกใช้การตรวจสอบ PEP8 เทียบกับแผนภูมิต้นไม้ขนาดใหญ่ แผนผังประกอบด้วยไฟล์ต่าง ๆ ในภาษาต่างๆ แนวคิดคือการตรวจสอบสคริปต์ Python ทั้งหมดโดยไม่ต้องแสดงรายการอย่างชัดเจน ไฟล์เหล่านี้ส่วนใหญ่ไม่มี.pyนามสกุล มีวิธีง่าย ๆ ในการค้นหาไฟล์ทั้งหมดที่มีคำว่า Python ใน shebang หรือค้นหาไฟล์ทั้งหมดที่จะรันด้วย Python เมื่อดำเนินการหรือไม่?

คำตอบ:


7

ลองทำสิ่งนี้:

grep -rl '^#!/.*python' .

สิ่งเดียวกันกับack :

ack -rl '^#!/.*python' .

5
โปรดทราบว่าในขณะที่grep -lจะหยุดอ่านไฟล์ทันทีที่พบการแข่งขันสำหรับไฟล์ที่ไม่มีข้อมูลตรงกันมันจะอ่านไฟล์ทั้งหมด นอกจากนี้ยังจะพบการจับคู่ที่ตรงกลางไฟล์เช่นสามารถจับคู่sharไฟล์ที่มีสคริปต์ไพ ธ อนได้
Stéphane Chazelas

14

ด้วย 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

1
+1 แต่คำสั่งสุดท้ายตรงกับไฟล์ว่างเช่นกัน
l0b0

จุดดี @ l0b0 Updated
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.