Linux에서 두 개의 문자열을 포함하는 파일을 찾는 방법은 무엇입니까? 포함하는 파일을 찾으려 string1하고 string2. 출력 파일의

나는 파일이 모두 포함 예를 들어, 두 개의 문자열을 포함하는 파일을 찾으려 string1하고 string2.

출력 파일의 전체 경로를 원합니다. “권한 거부”경고를보고 싶지 않습니다.



답변

grep -l string2 `grep -l string1 /path/*`

이것은 같은

grep -l string2 $(grep -l string1 /path/*)

편집 : 여기 왜 grep string1 /path/* | grep string2내가 alwbtc가 원하는 것으로 생각하지 않는가.

$ cd /tmp
$ cat a
apples
oranges
bananas
$ cat b
apples
mangoes
lemons
$ cat c
mangoes
limes
pears
$ cd ~
$ grep apples /tmp/* | grep mangoes
$

아무것도 발견되지 않았지만 파일 b에 두 문자열이 모두 포함되어 있습니다.

여기 alwbtc가 원하는 것 같습니다.

$ grep -l apples $(grep -l mangoes /tmp/*)
/tmp/b

답변

하나 grep를 다른 것으로 파이프 :

grep "string1" /path/to/files/* | grep "string2"


답변

여기에 동등한 RedGrittyBrick의 답변에 대한 명령 :

ack string2 $(ack string1 -l)

ack기본적으로 현재 디렉토리를 재귀 적으로 검색하는 것을 제외하고는 같은 방식으로 작동합니다 . 내부의 내용은 해당 문자열이 발견 된 파일 이름 만 $()검색 string1하지만 -l출력합니다. 그런 다음 외부 명령에 인수로 전달됩니다. 즉, string2해당 파일 목록 내에서만 검색됩니다.


답변

comm -12 <(grep --fixed-strings --files-with-matches "STRING1" /path/to/files/* 2>/dev/null | sort) <(grep --fixed-strings --files-with-matches "STRING1" /path/to/files/* 2>/dev/null | sort)

또는 덜 중복 :

search_files () { str="$1"; shift; grep -Fl "$str" "$@" 2>/dev/null | sort; }
comm -12 <(search_files "STRING1" /path/to/files/*) <(sf "STRING2" /path/to/files/*)

문자열이 동일한 파일의 다른 행에 있으면 작동하며 파일 이름에 문자열 중 하나가 포함되어 있으면 오 탐지를 피할 수 있습니다.


답변

무인 명령을 실행할 때 단점이있는 @RedGrittyBrick의 솔루션을 자세히 설명하고 의도대로 오류 출력을 억제하고 파일을 재귀 적으로 찾기 위해 고려할 수 있습니다

grep -l 'STRING1' $(! grep -lrs 'STRING2' /absolute/path/to/search/dir && echo /dev/null)

-s오류 메시지가 표시되지 않습니다 옵션
-r옵션은 임의의 중첩 된 디렉토리에있는 문자열을 검색 할 수 있습니다
!와 결합 && echo /dev/null명령을 끊지 것을 보장한다. 그렇지 않으면 inner grep파일을 찾지 못하면 아무것도 출력하지 않으므로 outer grep입력이 검색 될 때까지 무기한 대기합니다. 이 솔루션은 출력 /dev/null이 경우에 그렇게 outer grep를 검색합니다 STRING1에서 /dev/null이 아무것도 발견하지 않도록 해야하는 경우.


답변

나는 2 개 이상의 문자열 을 수행 할 수있는 확장 가능한 방법을 찾고 있었고 이것을 생각해 냈습니다.

grep -rl string1 path-to-files | xargs grep -l string2 | xargs grep -l string3

첫 번째 그렙은 재귀 적으로 포함하는 파일의 이름을 찾아 string1내를 path-to-files.

에 대한 xargs파일에서 하나 이상의 grep 명령을 실행하는 결과가 파이프됩니다 string2.

결과는 다른 xargs명령 으로 파이프 string3됩니다. 첫 번째 xargs호출 과 동일 하지만 다른 문자열을 찾습니다.

를 사용 xargs하면 결과가 너무 많아서 백틱을 사용한 결과 명령 줄이 너무 긴 경우 문제를 피할 수 있습니다.

우리가 리디렉션 할 수 있습니다 경고 피하려면 stderr로를 /dev/null:

grep -rl string1 path-to-files  2>/dev/null | xargs grep -l string2

string1파일 내부에서 이미 발견되어 권한이 양호한 것으로 알려진 후속 grep 호출에는 필요하지 않습니다 .