모든 디렉토리와 하위 디렉토리를 재귀적으로 grep
find . | xargs grep "texthere" *
질문자 :wpiri
모든 디렉토리와 하위 디렉토리를 재귀적으로 grep
find . | xargs grep "texthere" *
grep -r "texthere" .
첫 번째 매개변수는 검색할 정규식을 나타내고 두 번째 매개변수는 검색해야 하는 디렉토리를 나타냅니다. 이 경우, .
현재 디렉토리를 의미합니다.
참고: 이것은 GNU grep에서 작동하며 Solaris와 같은 일부 플랫폼에서는 레거시 구현과 반대로 GNU grep을 특별히 사용해야 합니다. Solaris의 경우 이것은 ggrep
명령입니다.
원하는 파일의 확장자 또는 패턴을 알고 있는 경우 다른 방법은 --include
옵션을 사용하는 것입니다.
grep -r --include "*.txt" texthere .
--exclude
를 사용하여 제외할 파일을 언급할 수도 있습니다.
코드를 자주 검색하는 경우 Ag(The Silver Searcher) 는 grep에 대한 훨씬 빠른 대안이며 코드 검색에 맞게 사용자 지정됩니다. 예를 들어, 기본적으로 재귀적이며 .gitignore
나열된 파일과 디렉토리를 자동으로 무시하므로 grep 또는 find에 동일한 성가신 제외 옵션을 계속 전달할 필요가 없습니다.
또한:
find ./ -type f -print0 | xargs -0 grep "foo"
그러나 grep -r
이 더 나은 대답입니다.
나는 이제 항상 다음을 사용합니다( GoW가 있는 Windows에서도 -- Windows의 Gnu ).
grep --include="*.xxx" -nRHI "my Text to grep" *
(주석 에서 kronen 이 언급한 것처럼 2>/dev/null
을 추가하여 권한 거부 출력을 무효화할 수 있습니다)
여기에는 다음 옵션이 포함됩니다.
--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 시스템에서는 grep
및 grep -rn "stuff" .
-r
매개변수를 찾지 못합니다. find
명령을 사용하면 다음이 실행됩니다.
find . -type f -exec grep -n "stuff" {} \; -print
Solaris
및 HP-UX
동의합니다.
**
grep -r
사용하면 작동하지만 특히 큰 폴더에서는 과도할 수 있습니다.
보다 실용적인 사용법을 위해 다음은 globbing 구문 ( **
)을 사용하는 구문입니다.
grep "texthere" **/*.txt
패턴 선택 패턴이 있는 특정 파일만 greps합니다. Bash +4 또는 zsh 와 같은 지원되는 셸에서 작동합니다.
이 기능을 활성화하려면 shopt -s globstar
실행하십시오.
참조: Linux에서 특정 텍스트가 포함된 모든 파일을 찾으려면 어떻게 해야 합니까?
git grep
Git 버전 제어를 받는 프로젝트의 경우 다음을 사용합니다.
git grep "pattern"
훨씬 빠릅니다.
ripgrep
더 큰 프로젝트의 경우 가장 빠른 grepping 도구는 기본적으로 파일을 재귀적으로 ripgrep
rg "pattern" .
이것은 유한 오토마타, SIMD 및 공격적인 리터럴 최적화를 사용하여 검색을 매우 빠르게 만드는 Rust의 정규식 엔진 위에 구축되었습니다. 여기에서 자세한 분석을 확인하십시오.
심볼릭 링크가 아닌 실제 디렉토리만 따르고 싶다면,
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" .
디렉토리에서 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/
string
재귀적으로 포함하는 path
files
이름을 찾으려면 UNIX
경우 아래 명령을 사용하십시오.
find . | xargs grep "searched-string"
Linux
:
grep -r "searched-string" .
UNIX
서버에서 파일 찾기
find . -type f -name file_name
LINUX 서버에서 파일 찾기
find . -name file_name
파일 이름만 유용할 수도 있습니다.
grep -r -l "foo" .
ag는 지금 github.com/ggreer/the_silver_searcher 이 작업을 수행하는 가장 좋은 방법입니다. 기본적으로 ack과 동일하지만 몇 가지 최적화가 더 있습니다.
다음은 짧은 벤치마크입니다. 각 테스트 전에 캐시를 지웁니다(참조 https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache ).
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time grep -r "hey ya" . real 0m9.458s user 0m0.368s sys 0m3.788s ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time ack-grep "hey ya" . real 0m6.296s user 0m0.716s sys 0m1.056s ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time ag "hey ya" . real 0m5.641s user 0m0.356s sys 0m3.444s ryan@3G08$ time ag "hey ya" . #test without first clearing cache real 0m0.154s user 0m0.224s sys 0m0.172s
이것은 작동해야 합니다:
grep -R "texthere" *
디렉토리 구조의 모든 파일에서 특정 내용을 찾고 있다면 수행 중인 작업이 더 명확하므로 find
find -type f -exec grep -l "texthere" {} +
-l
(L의 소문자)은 텍스트가 포함된 파일의 이름을 표시합니다. 대신 일치 자체를 인쇄하려면 제거하십시오. 또는 -H
를 사용하여 일치 항목과 함께 파일을 가져옵니다. 모두 함께 다른 대안은 다음과 같습니다.
find -type f -exec grep -Hn "texthere" {} +
여기서 -n
은 줄 번호를 인쇄합니다.
이것은 현재 컴퓨터(Windows 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"
grep -r "texthere" .
(마지막 공지 기간)
(^크레딧: https://stackoverflow.com/a/1987928/1438029 )
설명:
grep -r "texthere" /
(모든 디렉토리와 하위 디렉토리를 재귀적으로 grep)
grep -r "texthere" .
(이 디렉토리와 하위 디렉토리를 재귀적으로 grep)
grep [options] PATTERN [FILE...]
[옵션]
-R, -r, --recursive
각 디렉토리에 있는 모든 파일을 재귀적으로 읽습니다.
-d recurse
또는--directories=recurse
옵션과 동일합니다.
$ grep --help
$ grep --help |grep recursive -r, --recursive like --directories=recurse -R, --dereference-recursive
ack
( http://beyondgrep.com/ )
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센트를 던지고 있습니다. 다른 사람들이 이미 언급했듯이 grep -r 은 모든 플랫폼에서 작동하지 않습니다. 어리석게 들릴지 모르지만 저는 항상 git을 사용합니다.
git grep "texthere"
디렉토리가 스테이징되지 않아도 그냥 스테이징하고 git grep을 사용합니다.
내 IBM AIX 서버(OS 버전: AIX 5.2)에서 다음을 사용합니다.
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
다음과 같이 파일의 경로/파일 이름과 상대 줄 번호를 인쇄합니다.
./inc/xxxx_x.h
2865: /*
어쨌든, 그것은 나를 위해 작동합니다 :)
Unix
및 Linux
환경에서 재귀적으로 String
을 검색하는 명령입니다.
UNIX
명령은 다음과 같습니다.
find . -name "string to be searched" -exec grep "text" "{}" \;
Linux
명령은 다음과 같습니다.
grep -r "string to be searched" .
사용 가능한 플래그 목록:
grep --help
현재 디렉토리의 정규 표현식 텍스트 와 일치하는 모든 항목을 해당 행 번호와 함께 반환합니다.
grep -rn "texthere" .
대소문자를 무시하고 해당 줄 번호를 사용하여 루트 디렉터리에서 시작하여 texthere 에 대한 모든 일치 항목을 반환합니다.
grep -rni "texthere" /
여기에 사용된 플래그:
-r
재귀-n
출력과 함께 줄 번호를 인쇄합니다.-i
나는 대소문자를 무시한다참고 find . -type f | xargs grep whatever
find와 일치하는 파일이 너무 많은 경우 "긴 인수 목록" 오류가 발생하는 솔루션 유형에 관계없이 실행됩니다.
가장 좋은 방법은 grep -r
이지만 사용할 find . -type f -exec grep -H whatever {} \;
대신에.
이것이 당신이 쓰려고하는 것 같아요
grep myText $(find .)
grep hit 파일을 찾으려면 이것은 다른 도움이 될 수 있습니다.
grep myText $(find .) | cut -d : -f 1 | sort | uniq
@christangrant 답변이 너무 많아서 입력할 수 없는 경우 재미를 위해 *.txt 파일을 빠르고 더럽게 검색합니다 :-)
grep -r texthere .|grep .txt
다음은 주어진 폴더($1)의 모든 하위 폴더를 순회하고 grep
사용하여 주어진 파일($2)에서 주어진 문자열($3)을 검색하는 재귀(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
.gz 파일의 경우 모든 파일과 디렉토리를 재귀적으로 스캔합니다. 파일 유형을 변경하거나 *
find . -name \*.gz -print0 | xargs -0 zgrep "STRING"
Linux 시스템의 모든 파일에 있는 문자열을 재귀적으로 grep하는 또 다른 구문
grep -irn "string" /
엄청난 결과를 표시하므로 파이핑으로 출력을 필터링해야 할 수도 있습니다.
The syntax is: cd /path/to/dir grep -r <"serch_word name"> .
출처 : http:www.stackoverflow.com/questions/1987926/how-do-i-grep-recursively