나는 파일이 모두 포함 예를 들어, 두 개의 문자열을 포함하는 파일을 찾으려 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"
답변
여기에 동등한 ackRedGrittyBrick의 답변에 대한 명령 :
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 호출에는 필요하지 않습니다 .