키워드 [중복]이 포함된 모든 파일 찾기

키워드 [중복]이 포함된 모든 파일 찾기

word1예를 들어 두 단어 와 (예를 들어) 이 포함된 디렉터리 트리에서 모든 텍스트 파일을 찾고 싶습니다 word2. 두 단어가 연속적으로 나타나는 경우만 찾을 수 있기 때문에 grep그럴 수 없습니다 . word1 word2다음을 포함하는 모든 파일을 찾고 싶습니다.둘 다이 두 단어가 반드시 연속되는 것은 아닙니다.

이상적으로는 검색 시 파일 이름과 파일에서 해당 용어가 발견된 컨텍스트를 인쇄해야 합니다. 이것이 도움이 될 것입니다. GUI는 아프지 않을 것입니다.

어떻게 해야 합니까?

답변1

find파일이 일치하는 것으로 간주되려면 모든 테스트를 통과해야 하는 함수를 사용하겠습니다 . grep조건과 일치하도록 두 명령을 함께 연결합니다.

find . -type f -exec grep -q word_one {} \; -exec grep -l word_two {} \;

쉘 특수 문자나 정규식 특수 문자가 있는 경우 단어를 인용(또는 사용)하는 것을 포함하여 필요에 따라 grep의 플래그를 조정할 수 있습니다 grep -F.

답변2

서로 다른 두 단어가 존재하는 파일을 검색하는 방법은 무엇입니까? 기본적인 문제에 대한 좋은 해결책이 많이 있습니다. 컨텍스트를 표시해야 하는 추가 요구 사항을 충족하려면 다음 답변 중 하나를 선택하면 됩니다(예:스티븐의) 그리고 조금 추가하세요:

find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';'  \
                                            -exec grep -A3 -B3 -E -H 'word1|word2' {} +

find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';'부분은 Stéphane의 두 번째 답변(이식 가능하지만 간단한 답변)입니다. 여기서 -l두 번째 옵션 (파일 이름 목록) 은 (상태와 함께 자동으로 검색 및 종료) grep로 대체됩니다 . -q그런 다음 최종 결과를 추가하여 grep결과를 표시합니다. 각 게임이 끝나면 세 줄이 -A3표시되고 -B3이전에는 세 줄이 표시됩니다. -E확장 정규 표현식이 ; word1|word2 없이 작동하도록 \해야 합니다 . 파일이 하나만 있어도 -H파일 이름이 강제로 인쇄됩니다.grep

답변3

당신은 이것을 할 것입니다 grep:

grep -Elrz "word2(.|\n)*word1|word1(.|\n)*word2" .

출력의 콘텐츠를 일치시켜야 하는 경우 l위 옵션을 제거하세요.

답변4

내 첫 번째 생각은 먼저 포함된 파일을 검색 word1한 다음 그 안에 포함된 파일을 검색하는 것 word2입니다.

grep -l word1 -r . | xargs grep -l word2

예:

$ cat FILE
word1
$ cat FILE1
word2
$ cat FILE2
word1
word2
$ grep -l word1 -r . | xargs grep -l word2
FILE2

GNU사용자 영역 에서 FreeBSD테스트되었습니다 .

관련 정보