![-EXEC를 사용하여 FIND 결과를 파악하고 파일로 출력하려면 어떻게 해야 합니까?](https://linux55.com/image/18032/-EXEC%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20FIND%20%EA%B2%B0%EA%B3%BC%EB%A5%BC%20%ED%8C%8C%EC%95%85%ED%95%98%EA%B3%A0%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EC%B6%9C%EB%A0%A5%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
예를 들어 설명하는 것이 가장 좋습니다.
저 할 수 있어요:
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
포함하는 확장자를 가진 모든 파일을 찾아 해당 줄을 . 파일이 있으면 잘리고, 없으면 생성됩니다.grep
something
output.txt
output.txt
사용 -exec
:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
여기에 Chris Downs의 의견을 통합하겠습니다. 위 명령을 사용하면 주어진 테스트(위의 단일 테스트만) 를 통과하는 경로 이름을 찾기 grep
위해 여러 번 실행 됩니다. 그러나 로 바꾸면 여러 경로 이름 (최대 특정 한도) 으로 호출됩니다 .find
-name
\;
+
grep
find
이슈 보기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
.