-EXEC를 사용하여 FIND 결과를 grep하고 파일로 출력하는 방법은 무엇입니까?


64

예제를 설명하는 것이 좋습니다.

저 할 수 있어요:

find . -name "*.py" -type f > output.txt

그러나 출력을 어떻게 같은 파일에 저장하려면 다음을 수행하십시오.

find . -name "*.py" -type f -exec grep "something" {} \

난 그냥 할 수 없어

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt

답변:


105

내가 당신을 올바르게 이해하면 이것이 당신이하고 싶은 것입니다 :

find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt

Find확장자가있는 모든 파일 py, grep행을 포함 something하고 저장하는 행만 output.txt. 파일에 포함 된 것이 있으면 교체됩니다.

편집 : -exec 사용 :

find . -name '*.py' -exec grep 'something' {} \; > output.txt

Chris Downs 의견을 여기에 통합하고 있습니다. 위 명령은 발견 된 grep횟수만큼 실행됩니다 find. 당신은 대체 경우, ;와 함께 +, grep에서 출력라고 find(특정 한도까지) 연결된. 주제에 대한 자세한 내용은 exec와 함께 세미콜론 (;) 대 플러스 (+) 사용 질문을 참조하십시오 .


16
+대신 사용 \;하면 실행 시간이 크게 향상됩니다 (실행 전까지 인수를 반복하기 때문에 ARG_MAX).
Chris Down

이제 나는 xargs의 힘을 이해합니다! 감사!
domih

4
grep -H출력에 파일의 파일 이름을 포함 시키려면 사용하십시오 .
Steinar

18

의 모든 파일에서 일치하는 모든 줄을 저장 하려면 명령 끝에 output.txt필수 항목이 없다는 점을 제외하고 마지막 명령이 작동합니다 ;.

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt

각 실행 grep에서 다른 파일로 출력을 생성하려면 셸을 실행하여 출력 파일 이름을 계산하고 리디렉션을 수행하십시오.

find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;

마지막으로 정말 좋은 : D
bakytn

@gilles 답변을 좀 더 유익하게 만들기 위해, 특히 다루는 파일 목록이 큰 경우이를 사용하여 grep의 결과와 함께 각 파일의 파일 이름 (상대 경로)을보고 할 수 있습니다 : find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt 그리고 grep'ed 라인의 라인 번호를보고 싶다면 물론 사용할 수 있습니다grep -n "something"
JJMpls

9

검색 할 파일을 필터링하는 데 사용할 수 있는 레코드, grephas --include--exclude인수 :

grep -r --include="*.py" "something" > output.txt

2
적어도 GNU grep는 않습니다.
phk

2

사용 tee:

find . -name '*.py' | tee output.txt | xargs grep 'something'

주의해야 할 점은, 당신이 공백을 포함하여 특수 문자 모든 파일이있는 경우입니다을 xargs하고 grep(잘 작동하지 않습니다 a file.txt두 개의 파일로 해석됩니다 afile.txt). 이에 대한 대안은 -x또는 을 사용하는 -print0것이지만 둘 중 하나를 오염시킬 것 output.txt입니다. 는 특정 특수 문자를 이스케이프 처리 -x하는 \데 사용 되며이 문자는에 있습니다 output.txt. 이 -print0필드는 null 바이트를 필드 구분자로 사용하며 (또한 필요 xargs -0) output.txt긴 연속 된 텍스트 줄처럼 보입니다.

이것을 다루는 방법은 당신에게 달려 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.