grep
모든 디렉토리와 하위 디렉토리를 재귀 적으로 어떻게합니까 ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
Redhat Linux에서 작동하지 않습니다. "일치하지 않음"오류가 발생합니다.
grep
모든 디렉토리와 하위 디렉토리를 재귀 적으로 어떻게합니까 ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
Redhat Linux에서 작동하지 않습니다. "일치하지 않음"오류가 발생합니다.
답변:
grep -r "texthere" .
첫 번째 매개 변수는 검색 할 정규식을 나타내고 두 번째 매개 변수는 검색 할 디렉토리를 나타냅니다. 이 경우 .
현재 디렉토리를 의미합니다.
참고 : 이것은 GNU grep에서 작동하며 Solaris와 같은 일부 플랫폼에서는 레거시 구현과 달리 GNU grep을 사용해야합니다. Solaris의 경우 이것이 ggrep
명령입니다.
AIX 5.3
예를 들어 함께 제공되는 grep에서는 작동하지 않습니다 .
원하는 파일의 확장자 나 패턴을 알고 있다면 다른 방법으로 --include
옵션 을 사용하는 것입니다.
grep -r --include "*.txt" texthere .
제외 할 파일을 언급 할 수도 있습니다 --exclude
.
코드를 자주 검색하는 경우 Ag (The Silver Searcher) 는 grep보다 훨씬 빠른 대안이며 코드 검색에 맞게 사용자 정의됩니다. 예를 들어, 기본적으로 재귀 적이며에 나열된 파일과 디렉토리를 자동으로 무시 .gitignore
하므로 grep 또는 find에 동일한 성가신 제외 옵션을 계속 전달할 필요가 없습니다.
=
우분투에서 잘 작동합니다. 추신 : 그것은 역행 된 공간이어야하지만 SO 마크 다운 파서는 실패했습니다.
grep
Ag가 아니라을 위해 찬성했다 . 그냥 알다시피 :)
--include "*.txt" --include "*.TXT"
또한:
find ./ -type f -print0 | xargs -0 grep "foo"
그러나 grep -r
더 나은 대답입니다.
find . -type f -exec grep "foo" '{}' \;
경우 지원되는 곳에서 잘 작동합니다.
find ./ -type f -print0 | xargs -0 grep "foo"
나는 항상 항상 사용합니다 (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;
...
-R
옵션으로 인해 재귀 적으로 ) 폴더에 적용합니다.
*
나 .
: (쉘에 의해 해석)을 글로브 패턴입니다 unix.stackexchange.com/a/64695/7490가 . ' .
'dotfiles를 선택하거나 아니라 (등 폴더를 점합니다 .git/
)
POSIX 시스템에서, 당신은 찾을 수 없습니다 -r
에 대한 매개 변수를 grep
당신의 grep -rn "stuff" .
의지가 실행되지, 그러나 당신이 사용하는 경우 find
명령을 그것은 것입니다 :
find . -type f -exec grep -n "stuff" {} \; -print
로 합의 Solaris
하고 HP-UX
.
-exec
옵션 - 기호는 {}
현재에 의해 발견 된 파일 이름에 대한 참조입니다 find
(우리가 발견 한 파일 이름으로 뭔가를 할 것입니다) 도구는 또한 -exec
옵션은 종료되어야한다 ;
이 모든 때문에합니다 (간부 명령의 종료 마크) 기호 만, 쉘에서 실행되면 해당 기호를 이스케이프해야합니다. 마지막으로 -print
옵션을 사용 find
하면 화면에서 찾은 파일 이름을 인쇄 할 수 있습니다.
**
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
심볼릭 링크가 아닌 실제 디렉토리 만 따르려면
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/ 이 답변을 읽고 혼란스러워하는 사람을위한 상징적 링크에 대한 짧은 소개
ag는 github.com/ggreer/the_silver_searcher에서 가장 좋아하는 방법 입니다. 기본적으로 ack와 동일하지만 몇 가지 최적화가 더 있습니다.
짧은 벤치 마크입니다. 각 테스트 전에 캐시를 지우십시오 (cf /ubuntu/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
디렉토리 구조에서 모든 파일의 특정 컨텐츠를 찾고 있다면, find
수행중인 작업이 더 명확 하기 때문에 사용할 수 있습니다 .
find -type f -exec grep -l "texthere" {} +
하는 것으로 -l
(L의와 downcase) 텍스트가 포함 된 파일의 이름을 표시합니다. 대신 매치 자체를 인쇄하려면 제거하십시오. 또는 -H
파일을 일치 항목과 함께 가져 오는 데 사용 하십시오. 모두 함께 다른 대안은 다음과 같습니다.
find -type f -exec grep -Hn "texthere" {} +
어디에서 -n
줄 번호를 출력합니다.
find
불필요한 사용 xargs
과 사용을 피할 수 있는 유일한 솔루션 으로 많은 찬사를 받았습니다 . :-)+
\;
-exec
이것은 현재 컴퓨터에서 내 경우 (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 개의 1 차 서브 디렉토리가있는 디렉토리입니다.
% 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
.
rg
재귀 grep 명령을 처음부터 결합하는 데 상당한 이점이 있습니다. 사용 rg
: rg foo
. 유닉스 도구 사용 : find . | xargs grep foo
. 파일에 따옴표가 있으면을 사용해야 find . -print0 | xargs -0 grep foo
합니다. 당신이 일년에 몇 번 이것을 사용한다면 기억할 것입니까?
find . -type f -exec grep 'regex' {} +
이러한 도구를 규칙적으로 사용하면 실제로 기억하기 쉬운 것을 잊어 버릴 것 입니다. 하지만 아마 당신은 실행해야 ctags
또는 etags
자주 물건을 찾을 필요가있는 경우 소스 트리 어쨌든합니다.
다음은 검색 A에 대한 명령입니다 String
에 재귀 적 Unix
및 Linux
환경.
에 대한 UNIX
명령입니다 :
find . -name "string to be searched" -exec grep "text" "{}" \;
에 대한 Linux
명령입니다 :
grep -r "string to be searched" .
참고 find . -type f | xargs grep whatever
발견 일치 너무 많은 파일이있는 경우 솔루션의 종류의 오류 "긴에 인수 목록"으로 실행됩니다.
가장 좋은 방법은 grep -r
사용할 수 없다면 find . -type f -exec grep -H whatever {} \;
대신 사용하십시오.
xargs
특히 "인수 목록이 너무 깁니다"문제에 대한 해결 방법입니다.
find . -type f | xargs -L 100 grep whatever
xargs
는이 동작을 즉시 사용할 수 있도록 표준화되었습니다. " xargs
유틸리티는 명령 행이 호출 될 때 결합 된 인수 및 환경 목록이 {ARG_MAX} -2048 바이트를 초과하지 않도록 명령 행 길이를 제한해야합니다."
다음은 주어진 폴더 ($ 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