it-swarm-ko.tech

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

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

제가 할수 있어요:

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
75
bakytn

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

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을 실행합니다. 그러나 ;+, grepfind의 출력을 연결하여 (최대 한도까지) 호출됩니다. 주제에 대한 자세한 내용은 질문 세미콜론 (;) 대 더하기 (+)를 사용하여 찾기 을 참조하십시오.

119
johnny

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"' {} \;

레코드의 경우 grep에는 --include--exclude 검색하는 파일을 필터링하는 데 사용할 수있는 인수 :

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

tee 사용 :

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

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

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

2
bahamat
grep -n CThread '`find . -name "*.cpp"`'
1
turningeagle