Dengan GNU, atau FreeBSD atau NetBSD atau OpenBSD (dan yang lainnya) awk
:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
Akan terlihat hanya pada baris pertama setiap file dan akan berjalan sesedikit yang awk
diperlukan.
The nextfile
pernyataan di atas tidak standar tetapi ditemukan dalam beberapa implementasi termasuk salah satu GNU (yang mungkin di mana ia berasal dari).
Sementara kode di atas akan tampak berfungsi dalam implementasi lain juga, nextfile
pernyataan itu tidak akan melakukan apa pun di sana (akan dikenali sebagai ekspresi yang terdiri dari nextfile
variabel yang tidak disetel ), sehingga itu berarti semua file akan dibaca sepenuhnya dan nama file akan dicetak untuk setiap baris yang cocok.
Jika awk
dukungan Anda FNR
(seperti POSIX awks melakukan tetapi bukan yang asli awk
, jadi pada Solaris /usr/xpg4/bin/awk
dan bukan /usr/bin/awk
) dan tidak nextfile
, Anda dapat menulisnya:
find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
Yang masih akan berjalan sesedikit awk
mungkin tetapi akan membaca file sepenuhnya.
Alternatif lain untuk menghindari membaca file sepenuhnya dan itu akan bekerja dengan setiap awk
dan find
tetapi berarti menjalankan satu awk
per file adalah:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -l
akan berhenti membaca file segera setelah menemukan kecocokan, untuk file tanpa kecocokan, itu akan membaca seluruh file. Itu juga akan menemukan kecocokan di tengah file, jadi misalnya itu bisa cocok denganshar
file yang berisi skrip python.