GNU, या FreeBSD या NetBSD या OpenBSD (और संभावित रूप से अन्य) के साथ awk
:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
केवल प्रत्येक फ़ाइल की पहली पंक्ति को देखेगा और awk
आवश्यकतानुसार कुछ s को चलाएगा ।
nextfile
बयान से ऊपर मानक नहीं है, लेकिन जीएनयू एक (जो शायद है यह जहां से उत्पन्न) सहित कुछ कार्यान्वयन में पाया जाता है।
हालांकि ऊपर दिया गया कोड अन्य कार्यान्वयन में भी काम करता दिखाई देगा, लेकिन 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
संभव के रूप में कुछ s चलेंगे, लेकिन फ़ाइलों को पूरी तरह से पढ़ेंगे।
फ़ाइलों को पूरी तरह से पढ़ने से बचने के लिए एक और विकल्प जो हर काम करेगा awk
और find
इसका मतलब होगा कि awk
प्रति फ़ाइल एक चलना होगा:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -l
जैसे ही कोई फ़ाइल ढूंढना बंद करता है, जैसे ही उसे कोई मेल मिलता है, बिना मिलान वाली फ़ाइलों के लिए, वह पूरी फ़ाइल को पढ़ लेगी। यह फाइलों के बीच में भी मैच ढूंढता है, इसलिए उदाहरण के लिए यह एक ऐसीshar
फाइल पर मेल कर सकता है जिसमें अजगर लिपियाँ हों।