it-swarm-korea.com

재귀 적으로 어떻게 grep합니까?

재귀 적으로 모든 디렉토리와 서브 디렉토리를 grep 할 수 있습니까?

find . | xargs grep "texthere" *
1532
wpiri
grep -r "texthere" .

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

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

2304
Vinko Vrsalovic

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

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

--exclude를 사용하여 제외 할 파일을 언급 할 수도 있습니다.

Ag

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

623
christangrant

또한:

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

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

120
Kurt

이제 항상 사용합니다 (Windows에서도 GoW-Windows의 Gn ) :

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;
...
109
VonC

POSIX 시스템에서는 grep에 대해 -r 매개 변수를 찾지 못하고 grep -rn "stuff" .가 실행되지 않지만 find 명령을 사용하면 다음과 같이됩니다.

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

SolarisHP-UX에 동의합니다.

21
rook

globbing **

grep -r를 사용하면 과장 될 수 있습니다 (특히 큰 폴더에서는).

보다 실용적인 사용을 위해 globbing 구문 (**)을 사용하는 구문이 있습니다.

grep "texthere" **/*.txt

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

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

참고 : Linux에서 특정 텍스트가 포함 된 모든 파일을 찾으려면 어떻게합니까?

git grep

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

git grep "pattern"

훨씬 더 빠릅니다.

ripgrep

큰 프로젝트의 경우, 가장 빠른 grepping 도구는 기본적으로 파일을 재귀 적으로 greps하는 ripgrep 입니다.

rg "pattern" .

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

16
kenorb

특정 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
11

파일 이름도 유용 할 수 있습니다.

grep -r -l "foo" .
10
chim

심볼릭 링크가 아닌 실제 디렉토리만을 따르고 싶다면,

grep -r "thingToBeFound" directory

심볼릭 링크와 실제 디렉토리를 따라 가려면 (무한 재귀에주의하십시오),

grep -R "thing to be found" directory

재귀 적으로 grep을 시도하기 때문에 다음 옵션이 유용 할 수 있습니다.

-H: outputs the filename with the line

-n: outputs the line number in the file

따라서 현재 디렉토리 나 하위 디렉토리에서 Darth Vader를 포함하는 모든 파일을 찾고 파일 이름과 행 번호를 캡처하지만 재귀가 심볼 링크를 따르지 않도록하려면 명령이 다음과 같이됩니다.

grep -rnH "Darth Vader" .

디렉토리에서 Word cat의 모든 언급을 찾으려면

/home/adam/Desktop/TomAndJerry 

현재 디렉토리에 있습니다.

/home/adam/Desktop/WorldDominationPlot

파일 이름은 캡처하지만 문자열 "cats"의 인스턴스의 줄 번호는 캡처하지 않고 재귀가 심볼릭 링크를 찾으면이를 따르기를 원할 때 다음 중 하나를 실행할 수 있습니다

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

출처:

실행중인 "grep --help"

이 답변을 읽고 그것에 대한 참조로 혼란스러워하는 사람들을위한 기호 링크에 대한 간략한 소개 : https://www.nixtutor.com/freebsd/understanding-symbolic-links/

9
SarcasticSully

ag는 지금이 작업을 가장 선호하는 방법입니다 github.com/ggreer/the_silver_searcher . 그것은 기본적으로 ack와 동일한 것입니다. 그러나 몇 가지 최적화가 더 있습니다.

여기에 짧은 벤치 마크가 있습니다. 각 테스트 전에 캐시를 삭제합니다 (cf https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache ).

[email protected]$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
[email protected]:$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
[email protected]$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
[email protected]$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s
8
dranxo

이것은 나의 현재 컴퓨터 (윈도우 7에서 git bash)에 대한 나의 경우에 효과가있는 것이다.

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

공백이있는 경로의 경우 -print0 및 -0을 항상 잊어 버립니다.

편집 : 내 선호하는 도구 대신 지금 ripgrep : https://github.com/BurntSushi/ripgrep/releases . 정말 빠르며 더 나은 기본값을가집니다 (기본적으로 재귀 적으로). 내 원래 대답과 동일한 예제이지만 ripgrep을 사용하는 경우 : rg -g "*.cs" "content pattern"

6
arkod

디렉토리 구조의 모든 파일에서 특정 내용을 찾고있는 경우 find을 사용할 수 있습니다.

find -type f -exec grep -l "texthere" {} +

-l (L의 소문자)는 텍스트가 포함 된 파일의 이름을 표시합니다. 대신 경기 자체를 인쇄하려면 제거하십시오. 또는 -H를 사용하여 일치 항목과 함께 파일을 가져올 수도 있습니다. 모두 함께, 다른 대안은 다음과 같습니다.

find -type f -exec grep -Hn "texthere" {} +

-n는 줄 번호를 인쇄합니다.

6
fedorqui

이것은 작동해야합니다 :

grep -R "texthere" *
5
sumit kumar

grep -r "texthere" .(마지막에 알림 기간} _

(^ 신용 : https://stackoverflow.com/a/1987928/1438029 )


명확화 :

grep -r "texthere" / (재귀 적으로 grep all 디렉토리 및 하위 디렉토리)

grep -r "texthere" . (재귀 적으로 grep 이들 디렉토리 및 하위 디렉토리)

grep 재귀 적

grep [options] PATTERN [FILE...]

[옵션]

-R, -r, --recursive

재귀 적으로 각 디렉토리 아래의 모든 파일을 읽습니다.

이것은 -d recurse 또는 --directories=recurse 옵션과 동일합니다.

http://linuxcommand.org/man_pages/grep1.html

grep 도움말

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

대안

ack ( http://beyondgrep.com/ )

ag ( http://github.com/ggreer/the_silver_searcher )

4
Geoffrey Hale

내 IBM AIX 서버 (OS 버전 : AIX 5.2)에서 다음을 사용하십시오.

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

이것은 파일에서 경로/파일 이름과 상대 라인 번호를 출력합니다 :

./inc/xxxx_x.h

2865 :/** 설명 : stringYouWannaFind * /

어쨌든, 그것은 나를 위해 작동합니다 :)

3
user3606336

아래는 StringUnix 환경에서 Linux을 재귀 적으로 검색하는 명령입니다.

UNIX 명령의 경우 :

find . -name "string to be searched" -exec grep "text" "{}" \;

Linux 명령의 경우 :

grep -r "string to be searched" .
3

나는 이것이 당신이 쓰려고하는 것 같아요.

grep myText $(find .)

grep hit 파일을 찾으려면이 방법이 도움이 될 수 있습니다.

grep myText $(find .) | cut -d : -f 1 | sort | uniq
2
Victor Faria

2018 년에는 대안보다 훨씬 빠르기 때문에 ripgrep 또는 the-silver-searcher를 사용하려고합니다.

다음은 336 개의 첫 번째 하위 디렉토리가있는 디렉토리입니다.

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

OSX에서는 ripgrep : brew install ripgrep를 설치합니다. 이것은 silver-searcher : brew install the_silver_searcher를 설치합니다.

2
hughdbrown

사용 가능한 플래그 목록은 다음을 참조하십시오.

grep --help 

현재 디렉토리에서 regexp texthere 에 대한 모든 일치 항목을 해당 줄 번호와 함께 반환합니다.

grep -rn "texthere" .

texthere 에 대한 모든 일치 항목을 루트 디렉토리에서 시작하여 해당 행 번호와 대소 문자를 무시하고 반환합니다.

grep -rni "texthere" /

여기에 사용 된 플래그 :

  • -r 재귀 적
  • -n 출력에 행 번호 인쇄
  • -i는 대소 문자를 무시합니다.
2
JSON C11

find . -type f | xargs grep whatever 종류의 솔루션은 너무 많은 파일이 find와 일치 할 때 "Argument list to long"오류로 실행됩니다.

가장 좋은 방법은 grep -r이지만 사용할 수 없다면 대신 find . -type f -exec grep -H whatever {} \;를 사용하십시오.

1
m.thome

@christangrant 대답이 너무 많아서 * .txt 파일을 빠르고 재미있게 검색 할 수는 있습니다. :-)

grep -r texthere .|grep .txt

1
PJ Brunet

다음은 주어진 폴더 ($ 1)의 모든 하위 폴더를 탐색하고 주어진 파일 ($ 2)에서 주어진 문자열 ($ 3)에 대해 grep 검색을 사용하는 재귀 적 (bash 및 sh로 가볍게 테스트 된) 함수입니다.

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

실행과 예제 출력 :

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename
0
James Brown