Python Shebang으로 모든 파일 찾기 검사를 실행하려고합니다.

큰 소스 트리에 대해 PEP8 검사를 실행하려고합니다. 트리는 다양한 언어로 된 파일들의 혼합으로 구성됩니다. 아이디어는 명시 적으로 나열하지 않고 모든 Python 스크립트를 확인하는 것입니다. 이 파일의 대부분은 실제로 .py확장자 가 없습니다 . shebang에서 Python이라는 단어가있는 모든 파일을 찾거나 실행될 때 Python으로 실행될 모든 파일을 찾는 간단한 방법이 있습니까?



답변

이것을 시도하십시오 :

grep -rl '^#!/.*python' .

ack 와 같은 것 :

ack -rl '^#!/.*python' .


답변

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가능한 한 적은 수의 파일을 실행 하지만 파일을 완전히 읽습니다.

또 다른 대안은 완전히 파일을 읽는 피하기 위해 그 모든 작업 것이다 awkfind하지만 하나의 실행 의미 awk파일 당은 다음과 같습니다

find . -type f -exec awk '
  /^#!.*python/{r=1};{exit}
  END {exit(1-r)}' {} \; -print


답변