find 명령을 사용하여 여러 패턴이 포함된 일부 파일을 동시에 찾고 싶습니다.
나는 다음과 같은 것을 시도했습니다 :
find . -name "*.xml" -exec grep -iH keyword1 + && grep -iH "keyword2" {} \;
그러나 위의 명령은 작동하지 않습니다.
Bash에서 구현할 수 있습니까?
답변1
내가 이해한 바로는 다음을 포함하는 목록을 나열하고 싶습니다.둘 다'키워드 1'과 '키워드 2'. 이를 위해 -exec
다음과 같은 두 가지 테스트를 사용할 수 있습니다.
find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -iH keyword2 {} \;
grep
첫 번째 항목이 true를 반환하면 조건부로 두 번째 항목이 실행됩니다 . 이 옵션은 "keyword1"만 포함하는 모든 파일을 나열하므로 -q
첫 번째 출력의 출력을 차단합니다 .grep
이 -H
옵션은 파일 이름과 함께 일치하는 행을 출력하므로 이를 사용하는 것이 좋습니다 -l
. 그래서
find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -il keyword2 {} \;
그러면 Caleb의 제안과 유사한 출력이 생성되지만 추가 -print
.
답변2
먼저, find로 이 작업을 수행하려면 두 번째 매개변수를 추가해야 합니다 -exec
. 매개변수당 하나의 명령만 실행할 수 있습니다. 여러 개의 명령어를 실행해야 한다면 하나의 명령어를 셸로 설정하고 여러 개의 명령어를 실행하는 방식으로 해킹을 해야 합니다. 이 find
작업은 다음과 같습니다.
find . -name "*.xml" -exec grep -qi "keyword1" {} \; -exec grep -qi "keyword2" {} \; -print
-print
grep이 수행하도록 하는 대신 파일 이름을 출력하기 위해 find 옵션을 사용하고 있으며 , -q
grep 옵션을 사용하여 자동 모드로 설정하여 find가 결과인지 여부를 알려주는 데 사용할 수 있는 반환 코드를 제공합니다. 참인지 거짓인지 확인한 후 계속 진행하세요. 마지막 단계에 도달하면(두 파일이 모두 일치함을 의미) 출력이 인쇄됩니다.
그러나 grep은 실제로 모든 파일을 두 번 검사해야 하기 때문에 이는 비효율적입니다. 질문이 문자 그대로라면 이렇게 해야 하지만 문자열이 포함된 파일을 찾으려면 다음과 같이 grep을 사용하여 한 번에 두 패턴을 모두 검색할 수 있습니다.
find . -name "*.xml" -exec grep -qi -e "keyword1" -e "keyword2" {} \; -print
편집하다:귀하의 질문은 정확히 무엇을 원하는지 명확하지 않으며 제가 제시한 두 가지 예는 실제로 다른 작업을 수행합니다. 첫 번째는 두 키워드를 모두 포함하는 파일만 인쇄하는 AND 연산이고, 두 번째는 두 문자열 중 하나가 포함된 경우 파일 이름을 인쇄하는 OR 연산입니다. 독을 선택하세요.
답변3
아니면 그냥 egrep을 사용하세요:
find . -name "*.xml" -exec egrep -iH "keyword1|keyword2" {} \;