예제에 대해 설명하는 것이 좋습니다.

할 수있는 작업 :

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 

답변

내가 올바르게 이해한다면 다음과 같이하세요.

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를 통합합니다. 주석 : 위 명령은 find가 주어진 테스트를 통과하는 경로 이름을 찾는만큼 grep가 실행되도록합니다 (단일 테스트). 그러나 \;+로 바꾸면 grep가 여러 경로 이름으로 호출됩니다. find (특정 한도까지).

질문 세미콜론 (;)과 더하기 ( +) exec in find 를 사용하여 주제에 대해 자세히 알아보세요.

댓글

  • +\; 대신 div>를 사용하면 실행 시간이 크게 향상됩니다 (ARG_MAX까지 실행 전에 인수를 경합하므로).
  • 이제 xargs의 힘을 이해했습니다! 감사합니다.
  • 출력에 파일의 파일 이름을 포함하려면 grep -H를 사용합니다.
  • 옵션 1을 사용하고 < xargs 직전에 div id = “ac06e117b9″>

를 사용하면 많은 추가 속도를 얻을 수 있습니다. 그리고 xargs에서 -P6 플래그를 사용하여 6 개의 프로세스 (이 경우)와 병렬로 실행할 수 있습니다 (숫자를 변경해도됩니다. 6에서 더 높거나 낮은 것으로, 컴퓨터 및 검색에서 더 빠른 것을 ' 확인). 참조 : unix.stackexchange.com/questions/131535/ …

  • iv 사용 \; 대신 id = “dd83a7ad33″>
  • 는 여러 파일을 grep에 전달하고 해당 세트의 파일에 ' 뭔가 ', 모든 파일이 테스트를 통과합니다. 따라서 ' 원하는 작업을 수행하지 못했습니다.

    답변

    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
    • @gilles 답변을 확장하여 좀 더 많은 정보를 제공합니다. 특히 파일 목록이있는 경우 ' 대량을 처리하는 경우 다음을 사용하여 grep ' ed 결과와 함께 각 파일의 파일 이름 (상대 경로)을보고 할 수 있습니다. find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt 그리고 ' e는 물론 grep -n "something"

    을 사용할 수있는 grep ' ed 줄의 줄 번호입니다. div>

    답변

    기록을 위해 grep에는 --include가 있습니다. 및 검색하는 파일을 필터링하는 데 사용할 수있는 --exclude 인수 :

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

    댓글

    • 적어도 GNU grep는합니다.

    답변

    tee 사용 :

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

    주의 사항은 파일이있는 경우입니다. xargsgrep가 잘 작동하지 않는 특수 문자 (공백 포함) 포함 (a file.txtafile.txt의 두 파일로 해석됩니다. 이에 대한 대안은 -x 또는 -print0를 사용하는 것이지만 둘 중 하나가 output.txt. -x는 특정 특수 문자를 이스케이프하기 위해 \를 사용하며 이는 output.txt에 있습니다.-print0는 필드 구분자로 null 바이트를 사용하며 (xargs -0도 필요함) output.txt는 하나의 긴 연속 된 텍스트 줄처럼 보입니다.

    이 작업을 처리하는 방법 (또는 처리하지 않는 방법)은 귀하에게 달려 있습니다.

    답변

    grep -n CThread "`find . -name "*.cpp"`" 

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다