* .c 파일의 재귀 grep 실패


13

다음과 같은 방법으로 모든 .c 파일에서 패턴을 재귀 적으로 검색하려고했습니다.

> grep -lr search-pattern *.c

그러나 이것을 출력으로 얻었습니다.

> grep: *.c: No such file or directory

내가 이것을 사용할 때 :

> grep -lr search-pattern *

나는 많이 얻습니다. 패턴이있는 디렉토리의 c 파일.

이전 표현에 어떤 문제가 있습니까?

답변:


22

--include옵션 을 사용하는 것이 좋습니다 grep.

grep -lr --include='*.c' search-pattern .

1
+1. 나는 --include=GLOB옵션을 몰랐다 . 재귀 옵션과 함께 사용하면 매우 강력하고 필요하지 않습니다 find. 좋은!
gertvdijk

여기 파티에 늦었지만 .명령 끝에 있는 것이 무엇인지 혼란 스럽 습니다.
Nathan Jones

1
@NathanJones : grep에는 검색 할 하나 이상의 파일 이름 또는 디렉토리가 필요합니다. 점은 말합니다 : 현재 디렉토리에서 검색
enzotib

3

*.c패턴은 쉘에 의해 평가된다. 사용하는 것처럼 현재 디렉토리에 적용됩니다 ls *.c.

나는 당신이 원하는 것이 그 *.c패턴과 일치하는 모든 파일을 (재귀 적으로) grep찾아서 검색하는 것입니다. 이를 수행하는 방법은 다음과 같습니다.

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

xargs검색 결과를 추가하는 데 사용 됩니다 find.


또는 다음과 같은 -exec옵션을 사용하십시오 .

find . -name "*.c" -exec grep -l search-pattern "{}" \;

또한 -l옵션 이 정말로 원하는지 확실하지 않습니다 grep. 첫 경기에서 멈출 것이다 :

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)

find/xargs공간에 포함 된 파일명 구문 나누기. -L의 옵션 grep각 파일의 첫 경기에 정지하고 다음 파일을 계속 하나는 패턴이 각각의 주어진 파일에 한 번 이상에 포함되어 있는지 확인하려면, 그것은 빠릅니다.
enzotib

@enzotib 감사 합니다. -print0및 옵션 을 사용하여 수정했습니다 xargs --null.
gertvdijk

-1

나는 이것이 다소 오래된 실이라는 것을 알고 있지만, 같은 질문을했기 때문에 선호하는 방식을 공유하고 싶습니다.

ls | grep "file.*.c"

2
문제는 파일 검색이 아닌 패턴 검색에 관한 것입니다.
Jay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.