2009-09-01 3 views

답변

12

여기서 파일 이름 (find command의 출력)을 egrep에 입력합니다. 실제로 파일 내용에 대해 egrep을 실행하려고합니다.

find . -name "*.txt" -exec egrep mystring {} \; 

또는

find . -name "*.txt" -print0 | xargs -0 egrep mystring 

확인 find command help는 하나의 인수가 무엇을 확인하는 더 나은 : 여기

는 대안의 커플.
첫 번째 방법은 모든 파일에 대해 새 프로세스를 생성하는 반면 두 번째 방법은 두 개 이상의 파일을 egrep에 인수로 전달합니다. 잠재적으로 불쾌한 파일 이름을 처리하려면 -print0 및 -0 플래그가 필요합니다 (예 : 파일 이름에 공백이 포함되어 있어도 파일 이름을 올바르게 구분할 수 있음). egrep으로 작동하지

+0

첫 번째 명령 끝에'\ +'또는'\;'가 누락되었습니다. – spatz

+0

mystring에서 파일 이름을 찾으려고 시도하지 않았습니까? 내 생각 엔 그가 다른 방향으로 찾고있는 것 같아. – Kevin

+0

@spatz : 발언에 감사 드리며, 나는 그 예를 고쳤다. –

2

시도 :

find . -name '*.txt' | xargs egrep mystring 

버전 두 가지 문제가있다 : 첫째

, *.txt 먼저 쉘에 의해 확장됩니다, 현재 디렉토리에 당신에게 파일의 목록을 제공하는이 예를 들어 .txt으로 끝나면 다음과 같이 표시됩니다.

[[email protected]:~]$ ls *.txt 
test.txt 
[[email protected]:~]$ 

find 명령은 find . -name test.txt이됩니다. 그냥 설명하기 위해 다음을 시도해보십시오

[[email protected]:~]$ echo find . -name *.txt 
find . -name test.txt 
[[email protected]:~]$ 

는 둘째, egrepSTDIN에서 파일 이름을지지 않습니다. 그들을 사용해야하는 인수로 변환하려면 xargs

+0

나는 또한 다음과 같은 패턴을 둘러싸는 제안 - 셸이 패턴 매칭을하지 못하도록하기 위해 따옴표로 묶습니다. –

+0

이러한 포괄적 인 답변을 제공 해주신 모든 분들께 감사드립니다. – Tolga

1
find . -name *.txt | egrep mystring 

*.txt 파일은 단지 경로이다 find . -name *.txt 의해 생성되는 출력 내에 mystring를 검색한다.

find . -name *.txt | xargs egrep mystring 
1

당신은

find . -iname *.txt -exec egrep mystring \{\} \; 
1

를 사용할 수 있습니다 여기에 ERROR로 시작하는 라인을 가지고 모든 *.log 파일의 파일 경로를 반환하는 예이다 :

대신 xargs을 사용할 수 있습니다 :

find . -name "*.log" -exec egrep -l '^ERROR' {} \; 
1

당신은 단지 파일 이름을 원하는 경우

+0

이것은 작동하지 않습니다. -R 옵션은 인수 목록에 제공된 경우에만 디렉토리로 순환됩니다. 이 경우 해당 디렉토리의 모든 파일은 .log로 끝나는 파일뿐만 아니라 읽을 수 있습니다. 이 방법으로 성공하면 쉘이 * .log를 분석하기 때문에 현재 디렉토리에 .log로 끝나는 파일이 있기 때문입니다. –

+0

아마도'egrep -R '패턴 "--include = *. log .'? – moala

1

egrep -R "pattern" *.log 
을 사용할 수 있습니다 egrep을 재귀 옵션 :

find . -type f -name '*.txt' -exec egrep -l pattern {} \; 

당신이 원하는 경우 파일 이름과 일치 :

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \; 
관련 문제