답변:
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
grep -l가없이 일치로 파일을, 일치를 발견하는 즉시로 파일을 읽는 중지 할 것, 그것은 전체 파일을 읽을 것입니다. 또한 파일 중간에서 일치하는 항목을 찾을 수 있으므로 예shar를 들어 파이썬 스크립트가 포함 된 파일에서 일치 할 수 있습니다.