큰 소스 트리에 대해 PEP8 검사를 실행하려고합니다. 트리는 다양한 언어로 된 파일들의 혼합으로 구성됩니다. 아이디어는 명시 적으로 나열하지 않고 모든 Python 스크립트를 확인하는 것입니다. 이 파일의 대부분은 실제로 .py
확장자 가 없습니다 . shebang에서 Python이라는 단어가있는 모든 파일을 찾거나 실행될 때 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
가능한 한 적은 수의 파일을 실행 하지만 파일을 완전히 읽습니다.
또 다른 대안은 완전히 파일을 읽는 피하기 위해 그 모든 작업 것이다 awk
및 find
하지만 하나의 실행 의미 awk
파일 당은 다음과 같습니다
find . -type f -exec awk '
/^#!.*python/{r=1};{exit}
END {exit(1-r)}' {} \; -print