디렉토리의 모든 파일에서 grep 작업을 수행하는 방법


219

xenserver를 사용하여 디렉토리에있는 각 파일에 대해 명령을 수행하여 명령 출력에서 ​​일부 내용을 가져 와서 파일에 추가하려고합니다.

사용하려는 명령과 필요에 따라 문자열을 grep하는 방법이 명확합니다.

그러나 내가 확실하지 않은 것은 더 이상 파일을 찾을 수 없을 때까지 다음 파일로 이동하여 각 파일 에서이 명령을 수행하는 방법입니다.

답변:


228

grep $PATTERN *충분할 것입니다. 기본적으로 grep은 모든 하위 디렉토리를 건너 뜁니다. 그러나 당신이 그들을 통해 grep하려는 grep -r $PATTERN *경우입니다.


37
"grep -r $ PATTERN." 충분하다. 재귀 grep의 경우 모든 파일을 지정할 필요는 없습니다
Cougar

1
여러 개의 확장을 어떻게 포함합니까? 예 : "* .cpp", "* .h"?
Tomáš Zato-복원 모니카

1
@ Tomáš Zato, * : 대신 모든 파일 패턴을 제공하십시오 grep $PATTERN *.cpp *.h. 어떤 파일을 grepping해야하는지에 대한보다 구체적인 규칙이 필요한 경우 find명령을 사용 하십시오 (Rob의 답변 확인).
umi

@umi grep -r x .결과를 실행 하면 모든 확장자의 모든 파일에서 나옵니다. 달리는 grep -r x *.scss것보다 결과가 나타나지 않습니다.
Chris

1
그것이 가능 @ 크리스, 당신은하지 않습니다 *.scss그렙은 당신이 원하는 모든 파일에 보이지 않도록 현재 디렉토리에있는 파일 어딘가 깊은 하위 디렉토리에 있습니다. --include옵션을 사용 하여 grep에게 특정 패턴과 일치하는 파일을 재귀 적으로 찾도록 지시 해야합니다 grep -r x --include '*.scss' . . 또는 그냥 사용 find하십시오 (Rob의 답변 참조).
umi

169

리눅스에서 나는 보통이 명령을 사용하여 dir 내의 특정 텍스트를 재귀 적으로 잡습니다.

grep -rni "string" *

어디,

r = 재귀, 즉 현재 디렉토리 내에서 검색 서브 디렉토리
n = stdout에 행 번호를 인쇄하려면
i = 대소 문자를 구분하지 않는 검색


32

찾기를 사용하십시오. 진지하게, 그것이 작동하는 파일을 실제로 볼 수 있기 때문에 가장 좋은 방법입니다.

find . -name "*.sql" -exec grep -H "slow" {} \;

-H는 mac마다 다르며 결과에 파일 이름이 표시됩니다.


7
find를 사용하기로 결정한 경우 , 각 grep에 대해 새로운 프로세스를 생성하고 파일 수가 많을수록 오버 헤드가 커지기 때문에 이를 xargs사용하지 않고 출력을 파이프하는 -exec것이 훨씬 빠릅니다 -exec. 파일 이름의 공백에 대한 표준 경고가에 적용됩니다 xargs.
Barton Chittenden

2
이것이 정확히 어떻게 보일까요? 나는 항상 xargs문법을 잊어 버린다 .
브라이언 피터슨

3
@BrianPeterson 그것은 다음과 같을 것입니다 :find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince

4

모든 하위 디렉토리를 검색하고 특정 파일 유형 만 검색하려면 grep with를 사용하십시오 --include.

예를 들어, 현재 디렉토리에서 * .yml 및 * .yaml의 텍스트를 재귀 적으로 검색합니다.

grep "text to search" -r . --include=*.{yml,yaml}

1

여러 명령을 수행하려면 다음을 사용할 수 있습니다.

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.