디렉토리 아래에있는 모든 파일을보다 간단하게 잡을 수있는 방법이 있습니까? 일부 내용에 대해 전체 트리를

일부 내용에 대해 전체 트리를 검색하고 싶을 때

find . -type f -print0 | xargs -0 grep <search_string>

성능 또는 간결성 측면에서이를 수행하는 더 좋은 방법이 있습니까?



답변

귀하의 grep지원 -r옵션 ( 재귀 )을 확인하십시오 .

grep -r <search_string> .

답변

하위 최적 대답 대신의 출력 배관의 find로는 grep, 당신은 실행할 수 있습니다

find . -type f -exec grep 'research' {} '+'

그리고 voila, 두 개 대신 하나의 명령!

설명 :

find . -type f

에서 모든 일반 파일을 찾으십시오.

-exec grep 'research'

grep ‘연구’

{}

찾은 파일 이름에서

'+'

파일 이름 당 한 번이 아니라 모든 파일 이름 당 하나의 명령을 사용하십시오.

Nb : ';'파일 이름 당 한 번 있었을 것입니다.

그 외에도 소스 코드를 처리하는 데 사용하면 ack코드 비트를 쉽게 찾을 수 있도록을 살펴볼 수 있습니다.

ack

편집하다 :

그 연구를 조금 확장 할 수 있습니다. 먼저 -name ''스위치를 사용하여 find지정된 이름 지정 패턴을 가진 파일을 찾을 수 있습니다.

예를 들면 :

  • 로그에 해당하는 파일 만 : -name '*.log'

  • c 헤더에 해당하는 파일 만 있지만 파일 이름 확장자는 대문자 또는 소문자로 지정할 수 없습니다. -iname *.c

주의 :에 같은 grepack-i스위치는이 경우의 경우를 구분을 의미한다.

이 경우 grep은 색상과 줄 번호없이 표시됩니다.

--color-n스위치 (각각 파일의 색상 및 줄 번호) 를 사용하여 변경할 수 있습니다 .

결국, 당신은 다음과 같은 것을 가질 수 있습니다 :

find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'

예를 들어

$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+'
./test2/target.c:1:hello

답변

하위 디렉토리로 재귀화하려는 경우 :

grep -R 'pattern' .

-R옵션은 표준 옵션이 아니지만 가장 일반적인 grep구현에서 지원됩니다 .


답변

상술 된 바와 같이 -r또는 -R(원하는 심볼릭 처리에 의존하는) 짧은 옵션이다.

그러나 -d <action>때때로 유용 할 수 있습니다.

좋은 점은 -d건너 뛰기 명령으로, 현재 레벨을 스캔하고 싶을 때 “grep : directory_name : 디렉토리입니다”를 침묵시킵니다.

$ grep foo *
grep: q2: Is a directory
grep: rt: Is a directory

$ grep -d skip foo *
$

그리고 물론 :

$ grep -d recurse foo *
(list of results that don't exist because the word foo isn't in our source code
and I wouldn't publish it anyway).
$

-d skip옵션은 다른 스크립트에서 정말 편리하므로 반드시 할 필요는 없습니다 2> /dev/null. 🙂


답변

많은 파일을 처리하는 경우 하위 폴더의 모든 파일을 가져 오는 대신 검색해야하는 파일을 정리하면 grep이 더 빨리 실행됩니다.

때때로이 형식을 사용합니다.

grep "primary" `find . | grep cpp$`

의 하위 폴더에있는 모든 파일을 찾기 .에이를 cpp. 그런 다음 해당 파일을 “1 차”로 grep하십시오.

원하는 경우 해당 결과를 계속해서 grep 호출로 파이프 할 수 있습니다.

grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"