답변:
내가 당신을 올바르게 이해하면 이것이 당신이하고 싶은 것입니다 :
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와 함께 세미콜론 (;) 대 플러스 (+) 사용 질문을 참조하십시오 .
grep -H
출력에 파일의 파일 이름을 포함 시키려면 사용하십시오 .
의 모든 파일에서 일치하는 모든 줄을 저장 하려면 명령 끝에 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"' {} \;
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
그리고 grep'ed 라인의 라인 번호를보고 싶다면 물론 사용할 수 있습니다grep -n "something"
사용 tee
:
find . -name '*.py' | tee output.txt | xargs grep 'something'
주의해야 할 점은, 당신이 공백을 포함하여 특수 문자 모든 파일이있는 경우입니다을 xargs
하고 grep
(잘 작동하지 않습니다 a file.txt
두 개의 파일로 해석됩니다 a
및 file.txt
). 이에 대한 대안은 -x
또는 을 사용하는 -print0
것이지만 둘 중 하나를 오염시킬 것 output.txt
입니다. 는 특정 특수 문자를 이스케이프 처리 -x
하는 \
데 사용 되며이 문자는에 있습니다 output.txt
. 이 -print0
필드는 null 바이트를 필드 구분자로 사용하며 (또한 필요 xargs -0
) output.txt
긴 연속 된 텍스트 줄처럼 보입니다.
이것을 다루는 방법은 당신에게 달려 있습니다.
+
대신 사용\;
하면 실행 시간이 크게 향상됩니다 (실행 전까지 인수를 반복하기 때문에ARG_MAX
).