[linux] 재귀 적으로 grep하는 방법은 무엇입니까?

grep모든 디렉토리와 하위 디렉토리를 재귀 적으로 어떻게합니까 ?

find . | xargs grep "texthere" *



답변

grep -r "texthere" .

첫 번째 매개 변수는 검색 할 정규식을 나타내고 두 번째 매개 변수는 검색 할 디렉토리를 나타냅니다. 이 경우 .현재 디렉토리를 의미합니다.

참고 : 이것은 GNU grep에서 작동하며 Solaris와 같은 일부 플랫폼에서는 레거시 구현과 달리 GNU grep을 사용해야합니다. Solaris의 경우 이것이 ggrep명령입니다.


답변

원하는 파일의 확장자 나 패턴을 알고 있다면 다른 방법으로 --include옵션 을 사용하는 것입니다.

grep -r --include "*.txt" texthere .

제외 할 파일을 언급 할 수도 있습니다 --exclude.

Ag

코드를 자주 검색하는 경우 Ag (The Silver Searcher) 는 grep보다 훨씬 빠른 대안이며 코드 검색에 맞게 사용자 정의됩니다. 예를 들어, 기본적으로 재귀 적이며에 나열된 파일과 디렉토리를 자동으로 무시 .gitignore하므로 grep 또는 find에 동일한 성가신 제외 옵션을 계속 전달할 필요가 없습니다.


답변

또한:

find ./ -type f -print0 | xargs -0 grep "foo"

그러나 grep -r더 나은 대답입니다.


답변

나는 항상 항상 사용합니다 (Windows에서도 GoW-Windows의 Gnu ).

grep --include="*.xxx" -nRHI "my Text to grep" *

여기에는 다음과 같은 옵션이 포함됩니다.

--include=PATTERN

일치하는 파일 만 검색하는 디렉토리에서 반복합니다 PATTERN.

-n, --line-number

각 출력 행 앞에 입력 파일 내의 행 번호를 붙여 넣으십시오.

(참고 : phuclv주석 을 추가 하여 -n성능을 크게 저하 시키므로 해당 옵션을 건너 뛸 수 있습니다)

-R, -r, --recursive

각 디렉토리 아래의 모든 파일을 재귀 적으로 읽으십시오. 이것은 -d recurse옵션 과 동일합니다 .

-H, --with-filename

일치하는 파일 이름을 인쇄하십시오.

-I

일치하는 데이터가없는 것처럼 이진 파일을 처리하십시오.
이것은 --binary-files=without-match옵션 과 동일합니다 .

대소 문자를 구분하지 않는 결과를 원하면 ‘ i‘( -nRHIi)를 추가 할 수 있습니다 .

나는 얻을 수 있습니다 :

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...


답변

POSIX 시스템에서, 당신은 찾을 수 없습니다 -r에 대한 매개 변수를 grep당신의 grep -rn "stuff" .의지가 실행되지, 그러나 당신이 사용하는 경우 find명령을 그것은 것입니다 :

find . -type f -exec grep -n "stuff" {} \; -print

로 합의 Solaris하고 HP-UX.


답변

globbing **

grep -r작품을 사용 하지만 특히 큰 폴더에서는 과잉 일 수 있습니다.

보다 실용적인 사용법을 위해 globbing 구문 ( **) 을 사용하는 구문은 다음과 같습니다.

grep "texthere" **/*.txt

패턴이 선택된 패턴으로 특정 파일 만 잡습니다. Bash +4 또는 zsh 와 같은 지원되는 쉘에서 작동합니다 .

이 기능을 활성화하려면 다음을 실행하십시오 shopt -s globstar..

참조 : 어떻게 리눅스에서 특정 텍스트를 포함하는 모든 파일을 찾을 수 있습니까?

git grep

Git 버전 관리하에있는 프로젝트의 경우 다음을 사용하십시오.

git grep "pattern"

훨씬 빠릅니다.

ripgrep

대규모 프로젝트의 경우 가장 빠른 ripgrep그 리핑 도구는 기본적으로 파일을 재귀 적으로 그 리핑하는 것입니다.

rg "pattern" .

이 시스템 은 유한 오토마타, SIMD 및 공격적인 리터럴 최적화를 사용하여 검색 속도를 높이는 Rust의 정규식 엔진 위에 구축되었습니다 . 여기 에서 자세한 분석을 확인 하십시오 .


답변

의 이름을 찾으려면 files과 함께 path반복적으로 특정 포함 string에 대한 명령 아래 사용 UNIX:

find . | xargs grep "searched-string"

에 대한 Linux:

grep -r "searched-string" .

UNIX서버 에서 파일을 찾으십시오

find . -type f -name file_name

LINUX 서버에서 파일을 찾으십시오

find . -name file_name