내 서버에서 첫 번째 줄이나 두 번째 줄에 N자 이상이 있는 모든 PHP 파일을 찾고 싶습니다.
발견된 파일 이름과 줄 내용을 모두 인쇄하고 싶습니다.
어떻게 해야 할까요? grep을 수행하려고 생각 중이지만 grep으로 파일의 행을 분석하는 방법을 모르겠습니다.
답변1
이를 수행하는 방법은 다음과 같습니다.
MIN_WIDTH=30
for f in $(find / -iname '*\.php'); do
if [ $(head -n 2 "$f" | tail -n 1 | wc -c) -gt $MIN_WIDTH ] || [ $(head -n 1 "$f" | wc -c) -gt $MIN_WIDTH ]; then
echo "$f";
fi
done
분석은 다음과 같습니다.
- 모든 파일을 조회합니다
.php
:find / -regex '.*\.php$'
- 파일의 두 번째 줄을 가져와 문자 수를 계산합니다.
head -2 "$f" | tail -1 | wc -c
- 파일의 첫 번째 줄을 가져와 문자 수를 계산합니다.
head -1 "$f" | wc -c
- 각각이 $MIN_WIDTH보다 큰지 비교: `[ $(…) -gt $MIN_WIDTH ]
- 둘 중 하나가 다음보다 큰 경우
$MIN_WIDTH
:if […] | […]
- 파일 이름을 출력합니다:
echo "$f"
답변2
zmo보다 다소 짧은 변형
find -iname "*.php" -exec grep -HP '.{6,}' {} \; | grep -P '^.+:[12]:'
여기서 6은 최소 문자 수입니다. 옵션 -H
은 파일에서만 grep되는 경우에도 파일 이름을 인쇄하는 것입니다(이 경우는 발견된 모든 파일이 연산자를 통해 별도로 grep되기 때문입니다 {}
)