-EXEC를 사용하여 FIND 결과를 파악하고 파일로 출력하려면 어떻게 해야 합니까?

-EXEC를 사용하여 FIND 결과를 파악하고 파일로 출력하려면 어떻게 해야 합니까?

예를 들어 설명하는 것이 가장 좋습니다.

저 할 수 있어요:

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

답변1

내가 올바르게 이해했다면 이것이 당신이 원하는 것입니다 :

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

해당 줄만 .py포함하는 확장자를 가진 모든 파일을 찾아 해당 줄을 . 파일이 있으면 잘리고, 없으면 생성됩니다.grepsomethingoutput.txtoutput.txt

사용 -exec:

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

여기에 Chris Downs의 의견을 통합하겠습니다. 위 명령을 사용하면 주어진 테스트(위의 단일 테스트만) 를 통과하는 경로 이름을 찾기 grep위해 여러 번 실행 됩니다. 그러나 로 바꾸면 여러 경로 이름 (최대 특정 한도) 으로 호출됩니다 .find-name\;+grepfind

이슈 보기find 및 exec에서 세미콜론(;)과 더하기 기호(+) 사용 비교이 주제에 대한 추가 정보.

답변2

의 모든 파일에 대해 일치하는 모든 줄을 저장하려는 경우 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"' {} \;

답변3

참고로 GNU에는 검색 파일을 필터링하는 데 사용할 수 있는 매개변수가 있습니다 grep.--include--exclude

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

답변4

물어:

그러나 출력을 동일한 파일에 저장하는 방법은 다음과 같습니다.

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

당신은 오해했습니다. 아무것도 전달할 수 없는 이유는 완전한 명령이 아니기 때문입니다. 닫는 명령문은 \쉘에게 다음 명령 줄을 계속 읽으라고 지시하지만 여기서는 그렇게 하려는 것이 아닙니다. 시도할 때:

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

\추가 인수로 전달되도록 공백 문자를 이스케이프 find하고 해당 옵션에 전달된 명령이 종료되지 않았다고 find불평합니다 .-exec

+명령은 또는 토큰을 추가하여 종료해야 하며 ;;토큰은 셸에 특수하므로 이스케이프하거나 인용해야 합니다. 또한 {}는 대부분의 셸에서 특별하므로 이스케이프하거나 인용해야 합니다.

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

또는

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

다음은 유효한 명령이므로 출력을 멋지게 리디렉션하고 파이프할 수 있습니다.

find . -name "*.py" -type f -exec grep "something" \{} \; > output.txt
find . -name "*.py" -type f -exec grep "something" '{}' + | fgrep -v notthesefiles: > output.txt

그런데, 쉘이 그 안의 문자를 해석하는 것을 원하지 않는다면 (@Kusalananda가 지적했듯이) 이 경우에는 불필요하더라도 작은 따옴표로 묶은 인수를 사용하는 것을 선호합니다.

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

;와 의 차이점을 +알아보려면 man find.

관련 정보