대규모 소스 트리에서 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
). 이는 모든 파일을 완전히 읽고 파일 이름이 일치하는 각 항목을 인쇄함을 의미합니다. 선.
awk
awks를 지원하고 FNR
(POSIX와 같지만 네이티브는 지원하지 않고 awk
Solaris에서는 대신 /usr/xpg4/bin/awk
) /usr/bin/awk
awks를 지원하지 않는 경우 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