특정 텍스트 문자열을 포함하는 모든 파일을 찾고 싶습니다. grep
명령은 작동하지만, 나는 (내가 현재 디렉토리 위해 그것을 할 경우에만 가능) 모든 디렉토리를 사용하는 방법을 모르겠어요. 나는 독서를 시도했지만 man grep
아무런 도움이되지 않았다.
--include="*.C"
@Lekensteyn 덕분에 옵션 @ user311346이 포함 된 와일드 카드 .
특정 텍스트 문자열을 포함하는 모든 파일을 찾고 싶습니다. grep
명령은 작동하지만, 나는 (내가 현재 디렉토리 위해 그것을 할 경우에만 가능) 모든 디렉토리를 사용하는 방법을 모르겠어요. 나는 독서를 시도했지만 man grep
아무런 도움이되지 않았다.
--include="*.C"
@Lekensteyn 덕분에 옵션 @ user311346이 포함 된 와일드 카드 .
답변:
사용하는 것이 좋습니다
grep -rl "string" /path
어디
-r
(또는 --recursive
) 옵션은 모든 하위 디렉토리를 탐색하는 데 사용되는 /path
반면,-l
(또는 --files-with-matches
) 옵션은 일치하는 줄이 아닌 일치하는 파일의 파일 이름 만 인쇄하는 데 사용됩니다 ( grep
이 옵션과 처음 일치 할 때 파일 읽기 를 중지 하면 속도가 향상 될 수도 있습니다).-rlF
스위치를 사용 합니다 -F
. 물론 작업이 정규 표현식을 사용하는 경우 실례합니다. 물론, -r이없는 동일한 이론은 사람들이 grep 검색을 "텍스트"라고 가정하고 정규 표현식과 같은 것을 의미하는 특수한 문제를 일으킬 수 있다는 것을 종종 알 수 있습니다.
-i
대소 문자를 무시 하는 플래그 도 있습니다 .
--recursive
옵션 을 보여주고 싶습니다. 많은 옵션과 사용 시나리오가 있습니다. 나는 @dmityugov에서 받아 들여진 대답에서 시작하여없이 일하도록 수정되었습니다 find
.
--include '*.h'
파일에서 일치하는 줄을 찾고 있다면 내가 가장 좋아하는 명령은 다음과 같습니다.
grep -Hrn 'search term' path/to/files
-H
파일 이름이 인쇄되도록합니다 (여러 파일을 검색 할 때 포함됨)-r
재귀 적 검색을한다-n
줄 번호가 인쇄됩니다path/to/files
.
현재 디렉토리에서 검색 할 수 있습니다
매우 유용한 추가 옵션 :
-I
이진 파일 무시 (보완 : -a
모든 파일을 텍스트로 처리)-F
search term
정규식이 아닌 리터럴로 취급-i
대소 문자를 구분하지 않는 검색을 수행--color=always
배관 할 때에도 색상을 강제로 적용합니다 less
. less
지원 색상 을 만들려면 다음 -r
옵션 을 사용해야합니다 .
grep -Hrn search . | less -r
--exclude-dir=dir
.svn
and 같은 디렉토리를 제외하는 데 유용합니다 .git
.-H
가능한 한 하나 이상의 파일이 있으면 폴더에서 중복됩니다. 사실, 사람이 페이지는 말한다-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
나는 당신이 다음과 같은 것을 사용할 수 있다고 생각합니다 :
find /path -type f -exec grep -l "string" {} \;
의견 설명
find
주어진 경로의 서브 디렉토리에서 디렉토리 및 링크와 같은 파일 및 기타 오브젝트를 찾을 수있는 명령입니다. 파일 이름이 충족해야하는 마스크를 지정하지 않으면 모든 디렉토리 객체가 열거됩니다.
-type f
디렉토리 등이 아닌 파일 만 처리하도록 지정합니다. -exec grep
모든 발견 파일, 그것은 대체하여, 그것의 인수로 자사의 파일 이름을 전달위한 grep 명령을 실행하도록 지정 {}
파일 이름으로-name '*.py'
'.py'로 끝나는 파일로 일치가 제한됩니다.
... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
내 기본 명령은
grep -Rin string *
ls
재귀에 사용하기 때문에 국회 의사당 'R'을 사용합니다. grep이 두 가지를 모두 허용하므로 사용하지 않을 이유가 없습니다.
편집 : HVNSweeting 당, 분명히 그렇지 않은 -R
경우 심볼릭 링크를 따릅니다 -r
.
shopt -s dotglob
기억하십시오 -s
. 그런 다음 파일을 제거 할 때주의하십시오. 당신이 dotglob 설정 한 경우, rm -r *
현재 디렉토리에있는 모든 것을 제거하지만 또한 디렉토리 위에 있기 때문에 ..
일치. dotglob를 비활성화하려면 shopt -u dotglob
( "unset")을 사용하십시오. 변경 사항은 일시적이지만 현재 셸에만 적용됩니다.
shopt -s dotglob & <grep cmd> & shopt -y dotglob
더 편리한 것 같은 것 ? 이렇게하면 재설정에 대해 걱정할 필요가 없습니다
grep -Rin string .
대부분의 경우 에 사용하기가 더 쉽습니다 . 나는 더 자연스럽게 오는 것처럼 보이기 때문에 *를 사용합니다.
R
상징적 인 링크를 따르고 r
그렇지 않다는 것입니다
새로운 것을 기꺼이 시도하고 싶다면 ack
촬영하십시오. 현재 디렉토리를 재귀 적으로 검색하는 명령 string
은 다음과 같습니다.
ack string
설치는 매우 간단합니다.
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(이미 디렉토리를 가지고 있으며 ~/bin
바람직하게 는 디렉토리 에 있습니다 PATH
.)
chmod
명령 의 마지막 매개 변수는 무엇을합니까 ? 그것들은 특정 적이 chmod
거나 배쉬와 관련이 !#:3
있습니까 ( 부분)?
!
입니다 이벤트 지정자 . 그들은 반복을 피하기 위해 매우 강력합니다. !#:3
지금까지 명령 줄의 세 번째 토큰을 참조합니다 ( ~/bin/ack
이 경우).
rgrep 명령은 그러한 요구에 전념합니다
사용할 수없는 경우 다음과 같이 얻을 수 있습니다
mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep
위에서 설명한대로 기본 grep 옵션을 직접 설정할 수 있습니다.
나는 개인적으로 사용
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"
관련 주제 : 항상 rgrep을 색상과 함께 사용하는 방법
업데이트 2 :
이 명령 줄은 문제를 사용 find
하고 grep
수정합니다.
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
컬러 출력의 경우 :
$ find path_to_search_in -type f \
-exec grep --color=always -in searchString {} 2>/dev/null +
예:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
아래 스냅 샷에서 예제를 실행하십시오.
업데이트 1 :
다음 코드를 시도해 볼 수 있습니다. 귀하 .bashrc
또는 .bash_aliases
스크립트에서 함수로 :
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done }
용법: wherein /path/to/search/in/ searchkeyword
예:
$ wherein ~/Documents/ "hello world"
(참고 : @enzotib의 아래 주석에서 제안한 것처럼 이름에 공백을 포함하여 파일 / 디렉토리에서는 작동하지 않습니다.)
원본 게시물
문자열을 검색하고 검색 문자열을 사용하여 해당 행만 출력하려면 다음을 수행하십시오.
$ for i in $(find /path/of/target/directory -type f); do \
grep -i "the string to look for" "$i"; done
예 :
$ for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done
검색 문자열이 포함 된 파일 이름을 표시하려면
$ for i in $(find /path/of/target/directory -type f); do \
if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
예 :
$ for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
grep
사용하여 다음에 해당되는 부분 집합에, find
함께 grep
...하지만 당신은 독특한 답변으로 다른 스위치와 비틀기를 받아 들일 경우, 아마 내 것도 여기에 맞을 것이다. 마지막 업데이트는 검색에서 원하는 것을 수행합니다 : 검색 키가있는 줄과 줄 번호가있는 파일 이름. 너무 :) 더 나은 가독성을 위해 출력 및 오류 필터를 색 ..
grep
( GNU 또는 BSD )다음 과 같이 grep
도구를 사용 하여 -r
매개 변수 를 사용 하여 현재 폴더를 재귀 적으로 검색 할 수 있습니다 .
grep -r "pattern" .
참고 : -r
-하위 디렉토리를 재귀 적으로 검색합니다.
특정 파일 내에서 검색하려면 다음과 같은 글 로빙 구문을 사용할 수 있습니다 .
grep "class foo" **/*.c
참고 : 글 로빙 옵션 ( **
) 을 사용 하면 특정 확장자 또는 패턴으로 모든 파일을 재귀 적으로 검색합니다. 이 구문을 사용하려면 다음을 실행하십시오 shopt -s globstar
.. **/*.*
모든 파일 (숨김 및 확장명 제외) 또는 다른 패턴 에도 사용할 수 있습니다 .
인수가 너무 길다는 오류가 발생하면 검색 범위를 좁히거나 다음 find
과 같은 구문을 사용하십시오.
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
또는을 사용하십시오 ripgrep
.
ripgrep
더 큰 프로젝트 나 큰 파일을 작업하는 경우 다음 ripgrep
과 같이 대신 사용해야 합니다.
rg "pattern" .
GitHub 프로젝트 페이지 에서 문서, 설치 단계 또는 소스 코드를 확인 하십시오 .
이 같은 다른 도구보다 훨씬 빠릅니다 GNU / BSD grep
, ucg
, ag
, sift
, ack
, pt
이 위에 구축되어 있기 때문에, 또는 유사한 녹의 정규식 엔진이 매우 빠르게 검색 할 수 있도록, SIMD 공격적인 문자 최적화를 유한 오토마타를 사용합니다.
.gitignore
파일에 지정된 패턴 무시를 지원 하므로 단일 파일 경로를 여러 glob 패턴과 동시에 일치시킬 수 있습니다.
다음과 같은 일반적인 매개 변수를 사용할 수 있습니다.
-i
-민감한 검색.-I
-이진 파일을 무시하십시오.-w
-전체 단어를 검색합니다 (일부 단어 일치와 반대).-n
-당신의 경기 라인을 보여줍니다.-C
/ --context
(예 -C5
)-컨텍스트를 증가시켜 주변 코드를 볼 수 있습니다.--color=auto
-일치하는 텍스트를 표시하십시오.-H
-텍스트가있는 파일 이름을 표시합니다.-c
-일치하는 줄 수를 표시합니다. 와 결합 할 수 있습니다 -H
.나는 매우 과소 평가 된 명령 인 xargs를 사용 하여이 작업을 수행합니다.
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
find ./는 현재 폴더에있는 모든 파일의 재귀 목록을 제공 한 다음 xargs로 파이프하여 해당 파일 각각에 대해 grep 명령을 실행합니다.
xargs
하지 않고 -print0
에 대한 옵션 find
과 -0
옵션의 정보는 다음의 제품에 xargs
사용되지 않습니다, 그것은 공백이 포함 된 파일 이름에 실패합니다.
여기에 많은 답변이 있지만 파일을 검색 할 때 다른 제한 사항을 추가하려는 경우 대안이 있습니다.
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
grep
결과가 발견되면 0을 반환하고 그렇지 않으면 1을 반환 하기 때문에 작동합니다 . 예를 들어, 당신은 1메가바이트 큰 파일을 찾을 수 및 포함 뭔가를 :
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
여러 요구 사항의 경우 -O
GNU grep에 존재 하는 최적화 프로그램 플래그를 사용하고 싶을 것입니다 .