Với GNU, hoặc FreeBSD hoặc NetBSD hoặc OpenBSD (và có khả năng khác) awk
:
find . -type f -exec awk '
/^#!.*python/{print FILENAME}
{nextfile}' {} +
Chỉ nhìn vào dòng đầu tiên của mỗi tệp và sẽ chạy vài awk
giây nếu cần.
Các nextfile
tuyên bố trên không phải là tiêu chuẩn nhưng được tìm thấy trong một vài triển khai trong đó có một GNU (mà có lẽ nơi nó có nguồn gốc từ).
Mặc dù mã ở trên cũng có vẻ hoạt động trong các triển khai khác, nhưng nextfile
câu lệnh sẽ không làm gì ở đó (sẽ được công nhận là một biểu thức bao gồm một nextfile
biến không đặt ), vì vậy điều đó có nghĩa là tất cả các tệp sẽ được đọc đầy đủ và tên tệp sẽ được in cho mỗi dòng phù hợp.
Nếu các awk
hỗ trợ của bạn FNR
(như POSIX awks làm nhưng không phải là bản gốc awk
, thì trên Solaris /usr/xpg4/bin/awk
và không /usr/bin/awk
) và không nextfile
, bạn có thể viết nó:
find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
Mà vẫn sẽ chạy càng ít awk
càng tốt nhưng sẽ đọc các tệp đầy đủ.
Một cách khác để tránh đọc các tệp đầy đủ và điều đó sẽ hoạt động với mọi awk
và find
nhưng có nghĩa là chạy một awk
tệp cho mỗi tệp sẽ là:
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print
grep -l
sẽ dừng đọc một tệp ngay khi tìm thấy kết quả khớp, nhưng đối với các tệp không khớp, nó sẽ đọc toàn bộ tệp. Nó cũng sẽ tìm thấy các kết quả khớp ở giữa các tệp, vì vậy, ví dụ, nó có thể khớp với mộtshar
tệp có chứa các tập lệnh python.