Python Shebang을 사용하여 모든 파일 찾기

Python Shebang을 사용하여 모든 파일 찾기

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

답변1

GNU, FreeBSD, NetBSD 또는 OpenBSD(및 기타) 사용 awk:

find . -type f -exec awk '
  /^#!.*python/{print FILENAME}
  {nextfile}' {} +

각 파일의 첫 번째 줄만 살펴보고 awk필요한 만큼만 실행합니다.

위 선언은 nextfile표준은 아니지만 GNU 구현(원본일 수 있음)을 포함한 일부 구현에서 찾을 수 있습니다.

위의 코드는 다른 구현에서도 작동하는 것처럼 보이지만 이 nextfile명령문은 아무 작업도 수행하지 않습니다(설정되지 않은 변수를 포함하는 표현식으로 인식됨 nextfile). 이는 모든 파일을 완전히 읽고 파일 이름이 일치하는 각 항목을 인쇄함을 의미합니다. 선.

awkawks를 지원하고 FNR(POSIX와 같지만 네이티브는 지원하지 않고 awkSolaris에서는 대신 /usr/xpg4/bin/awk) /usr/bin/awkawks를 지원하지 않는 경우 nextfile다음과 같이 작성할 수 있습니다.

find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +

awk가능한 한 짧은 시간 내에 실행되지만 파일을 완전히 읽습니다.

파일을 완전히 읽지 않고 모든 파일에 대해 작동하지만 파일당 하나씩 awk실행하는 또 다른 옵션은 다음과 같습니다.findawk

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

답변2

이 시도:

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

같은 것확인하다:

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

관련 정보