2013-03-08 2 views
110

xenserver로 작업하고 디렉토리에있는 각 파일에 명령을 수행하고 명령의 출력에서 ​​일부 내용을 제거한 다음 파일에 추가합니다.디렉토리의 모든 파일에서 grep 작업을 수행하는 방법

내가 원하는 명령과 필요한 경우 문자열을 grep하는 방법은 확실합니다.

하지만 확실하지 않은 점은 파일을 찾을 때까지 다음 파일로 이동하여 각 파일에서이 명령을 수행하는 방법입니다.

답변

58

리눅스에서, 나는 일반적으로 재귀, 어디 디렉토리

grep -rni "string" * 

에서 특정 텍스트를 grep으로이 명령을 사용하여

R = 재귀 즉, 현재 디렉토리 내에서 검색 하위 디렉토리
N = stdout에 줄 번호를 인쇄하는 방법
i = 대소 문자를 구별하지 않는 검색

132

grep $PATTERN *으로 충분합니다. 기본적으로 grep은 모든 하위 디렉토리를 건너 뜁니다. 그러나 grep을 사용하려면 grep -r $PATTERN *이 좋습니다.

+22

"그렙 -r의 $ 패턴." 충분하다. 재귀 적 grep의 경우 모든 파일을 지정할 필요가 없습니다. – Cougar

+1

여러 확장을 어떻게 포함합니까? 예 : "\ *. cpp", "\ *. h"? –

+1

@ Tomáš Zato는 * :'grep $ PATTERN * .cpp * .h' 대신 모든 파일 패턴을 제공합니다. 어떤 파일을 그릴 지에 대한 좀 더 구체적인 규칙이 필요하면'find' 명령을 사용하십시오 (Rob의 답을 확인하십시오). – umi

21

찾기를 사용하십시오.

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

주는 결과에서 파일 이름을 보여준다는 -H는 맥 전용입니다 : 진심으로, 그 다음 당신이 정말로에서 작동 무슨 파일을 볼 수 있기 때문에 가장 좋은 방법입니다. 여러 명령을 수행 할 경우

+5

find를 사용하기로 결정했다면,'-exec'를 사용하는 대신'xargs'를 통해 출력을 파이프합니다. 왜냐하면'-exec'이 각 grep에 새로운 프로세스를 생성하고 오버 헤드가 많은 수의 파일. 파일 이름의 공백에 대한 표준 경고는'xargs '에 적용됩니다. –

+2

이 모양은 정확히 무엇입니까? 나는 항상'xargs' 문법을 잊어 버린다. –

+1

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

2

, 당신은 사용할 수 있습니다

for I in `ls *.sql` 
do 
    grep "foo" $I >> foo.log 
    grep "bar" $I >> bar.log 
done 
관련 문제