소스 트리가 있고 특정 단어를 포함하고 두 번째 단어를 포함해서는 안 되는 모든 파일을 찾고 있습니다. 이는 새로운 코드를 포함하도록 이전 파일을 업데이트해야 하기 때문입니다.
find를 사용할 수 있다는 것을 알고 있지만 grep 문을 연결하려고 하면 두 번째 grep 문이 첫 번째 grep 문의 결과를 검색하고 길을 잃기 때문에 작동하지 않을 것 같은 느낌이 듭니다.
나는 시도했다:
find . -type f -name "*.c" -exec grep -Hl "ABC" {} \; | grep -L "123"
이것은 전혀 작동하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.
답변1
의 종료 상태는 일치 항목을 찾았는지 여부를 나타내므로 이를 조건부(필요한 부정 또는 )로 직접 테스트 grep
할 수 있어야 합니다 .find
!
-not
find . -type f -name "*.c" \( -exec grep -q "ABC" {} \; ! -exec grep -q "123" {} \; \) -print
-q
첫 번째 게임은 자동으로 종료됩니다. 파일 이름을 인쇄하도록 grep
놔두기 때문에 이에 대해 들을 필요가 없습니다 .find
답변2
이미 GNU 확장을 사용하고 있으므로:
find . -type f -size +2c -name "*.c" -exec grep -l --null ABC {} + |
xargs -r0 grep -L 123
이 파일에 대해 다른 작업을 수행하려면 다음을 수행하십시오.
find . -type f -size +2c -name "*.c" -exec grep -l --null ABC {} + |
xargs -r0 grep -L --null 123 | xargs -r0 sh -c '
for file do
something with "$file"
done' sh {} +
또는 zsh
다음을 사용하십시오 bash
.
find . -type f -size +2c -name "*.c" -exec grep -l --null ABC {} + |
xargs -r0 grep -L --null 123 |
while IFS= read -rd '' file; do
something with "$file"
done
답변3
복잡한 제약 조건의 경우 프로그래밍 언어인 Awk를 사용하는 것을 선호합니다.
find -name '*.c' \
-exec awk -v RS="\0" '/ABC/ && !/123/{print FILENAME}' {} \;