find (1) 및 grep (1)을 사용하여 특정 문자열이 포함 된 파일 찾기


70

find . -type f -print -exec cat {} \; | grep some string

위의 명령은 파일 경로를 인쇄하지 않습니다.

사용하고 있습니다 : Ubuntu, bash 4.


grep 필터로 인해 예상 한 결과를 충족하지 못할 수 있습니다. find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex

달성하고자하는 목표는 무엇입니까? 출력에서 파일에서 문자열을 가져 오는 경우 해당 파일의 경로를 원하십니까?
mirkobrankovic

예, 문자열 'some string'을 포함하는 파일의 경로를 인쇄하고 싶습니다. @artistoex 제안은 모든 파일 경로를 인쇄합니다.
H.Rabiee

당신은 간단하게 사용할 수 있습니다 ack아마도 특정 파일 형식 만 필터링, 현재 디렉토리 아래의 모든 파일을 통해 grep을 할 수 있습니다.
Jaap Eldering

답변:


87

grep파일 이름을 포함하는 텍스트 스트림을 제공하기 때문 입니다. grep에 대한 인수로 파일 이름을 제공하지 않았으므로 일치하는 행의 파일을 추론 할 수 없습니다. 사용 xargs:

find . -type f -print | xargs grep "some string"

GNU find / xargs가 있으므로 xargs가 파일 이름을 읽는 것이 더 안전한 방법입니다.

find . -type f -print0 | xargs -0 grep "some string"

일치하는 줄을 표시하지 않고 일치하는 줄이있는 파일 이름 만 원하는 경우 :

find . -type f -print0 | xargs -0 grep -l "some string"

위의 명령을 검색 및 바꾸기와 어떻게 결합합니까? 에서처럼 grep은 sed?
CMCDragonkai

1
find | grep 파이프 라인은 파일 이름을 출력합니다.sed '...' $(find ... | xargs grep -l ...)
glenn jackman

107

나는 사용한다

grep "some string" . -R

그리고 그것은 더 빨리 작동

추신

더 복잡한 사용 사례

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

param i 설명을 읽으려면

grep --help | grep -- -i

17
그리고 -n줄 번호를 원한다면. 간단한 답변을 위해 +1.
차드 스키터

@ChadSkeeters 정확하게. 은 Using 찾기 등의 솔루션을 제공하지 않습니다.
ArcherGodson

1
정직한 답변으로 표시해야합니다. 현재 선택된 것은 완전히 다른 것을 설명합니다.

11

종종 복잡한 폴더 구조에서 소스 코드를 검색하고 다음을 사용하여 유용합니다.

cd /your/folder/
grep -rHino "your string"

이러한 매개 변수 를 사용하면 find 사용하지 않고 파일 전체 경로지정된 문자열 이 포함 된 줄 번호 를 얻습니다 .

rHino 와 같은 검색을 통해 BASH가 발생 하기 때문에 기억하기도 쉽습니다. :)

나는 이것이 빠른 예제와 어떻게 작동하는지 보여줄 것이다.

cat을 사용하여 파일의 내용을 표시합시다 :

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

문자열 "iptables -P"를 포함하는 모든 파일을 재귀 적으로 검색해 보겠습니다.

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

출력에서 볼 수 있듯이 filename : hit row : searched string

사용 된 매개 변수에 대한 자세한 설명은 다음과 같습니다.

-r 각 디렉토리 피연산자에 대해 해당 디렉토리의 모든 파일을 반복적으로 읽고 처리하십시오. 명령 행에서 기호 링크를 따르되, 재귀 적으로 발생하는 심볼릭 링크는 건너 뜁니다. 파일 피연산자가 제공되지 않으면 grep은 작업 디렉토리를 검색합니다. 이것은 '--directories = recurse'옵션과 동일합니다.

-i 각 일치에 대한 파일 이름을 인쇄하십시오. 검색 할 파일이 둘 이상인 경우 이것이 기본값입니다.

-n 입력 파일 내에서 각 출력 행 앞에 1 기반 행 번호를 붙입니다. (-n은 POSIX에 의해 지정됩니다.)

-H 각 일치에 대한 파일 이름을 인쇄하십시오. 검색 할 파일이 둘 이상인 경우 이것이 기본값입니다.

-o 일치하는 행의 일치하는 (비어 있지 않은) 부분 만 인쇄합니다. 각 부분은 별도의 출력 행에 있습니다. 출력 행은 입력과 동일한 분리 문자를 사용하며 -z (-null-data)도 사용되는 경우 분리 문자는 널 바이트입니다 (기타 옵션 참조).


1

나는 선호했다

| 파일 찾기 | grep ont 파일 찾기 | 파일의 전체 경로 표시

find / -type f -exec grep '일부 문자열'{} \; -exec echo {} \;


0

Silver Searcher 는 파일과 콘텐츠를 검색 할 수있는 매우 빠르고 편리한 유틸리티입니다.

문제를 해결하기 위해 silver searcher 명령은 다음과 같습니다.

ag 'some string' -l

-l 일치하는 파일 이름 만 인쇄하십시오 (일치하는 줄은 인쇄하지 마십시오)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.