GNU veya FreeBSD veya NetBSD veya OpenBSD (ve muhtemelen diğerleri) ile awk
:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
Her dosyanın yalnızca ilk satırına bakar ve gerektiği kadar az sayıda çalışır awk
.
Yukarıdaki nextfile
ifade standart değildir ancak GNU olanı da içeren birkaç uygulamada bulunur (muhtemelen kaynaklandığı yer).
Yukarıdaki kod diğer uygulamalarda da çalışıyor gibi görünse de, nextfile
ifade orada hiçbir şey yapmaz (ayarlanmamış bir nextfile
değişkenden oluşan bir ifade olarak kabul edilir ), böylece tüm dosyalar tam olarak okunacak ve dosya adı her eşleşen satır için yazdırılacaktır.
Senin Eğer awk
destekleri FNR
(POSIX awks gibi değil orijinal ama yapacak awk
, böylece Solaris üzerinde /usr/xpg4/bin/awk
değil /usr/bin/awk
değil) nextfile
, bunu yazabiliriz:
find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
Bu da yine awk
de mümkün olduğunca az sayıda çalışır ancak dosyaları tam olarak okurdu.
Dosyaları tam olarak okumaktan kaçınmak için başka bir alternatif ve her biri ile çalışacak awk
ve dosya başına find
bir tane çalıştırmak anlamına awk
gelecektir:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -l
Bir eşleşme bulur bulmaz bir dosyayı okumayı bırakırken , eşleşmeyen dosyalar için dosyanın tamamını okuyacağını unutmayın. Ayrıca dosyaların ortasında eşleşmeler bulur, bu nedenle örneğinshar
python komut dosyaları içeren bir dosyada eşleşebilir .