한 조건은 포함하고 다른 조건은 제외하는 파일을 찾는 방법

한 조건은 포함하고 다른 조건은 제외하는 파일을 찾는 방법

소스 트리가 있고 특정 단어를 포함하고 두 번째 단어를 포함해서는 안 되는 모든 파일을 찾고 있습니다. 이는 새로운 코드를 포함하도록 이전 파일을 업데이트해야 하기 때문입니다.

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}' {} \; 

관련 정보