모든 .txt 파일을 찾고 일부 문자열을 검색한다고 가정 해 보겠습니다.

find ./ -type f -name "*.txt" -exec egrep -iH "something" "{}" \; 

다음과 같이 더 복잡한 필터링을 수행하려면 어떻게해야합니까?

egrep something file.txt | egrep somethingelse | egrep other 

Inside find -exec? (또는 유사)

필요할 때 쉽게 입력 할 수있는 솔루션을 찾고 있다는 점을 명심하십시오. 쉘 스크립트를 사용하여 몇 줄로이 작업을 수행 할 수 있다는 것을 알고 있습니다. 그러나 그것은 제가 찾고있는 것이 아닙니다.

답변

찾기 내에서 수행해야하는 경우 셸을 호출해야합니다.

find ./ -type f -name "*.txt" -exec sh -c "grep -EiH something "$1" | grep -E somethingelse | grep -E other" sh {} \; 

다른 대안으로는 xargs를 대신 사용하는 것이 있습니다.

find ./ -type f -name "*.txt" | xargs -I{} grep -EiH something {} | grep -EiH somethingelse | grep -EiH other 

또는 , 임의의 파일 이름에 대해 훨씬 안전합니다 (find-print0를 지원한다고 가정) :

find ./ -type f -name "*.txt" -print0 | xargs -0 grep -EiH something {} | grep -Ei somethingelse | grep -Ei other 

또는 대신 쉘 루프를 사용할 수 있습니다.

find ./ -type f -name "*.txt" -print0 | while IFS= read -d "" file; do grep -Ei something "$file" | grep -Ei somethingelse | grep -Ei other done 

댓글

  • 첫 번째는 정확히 제가 찾던 것입니다. 내 필요에 따라 입력하기에 매우 간단하고 작습니다. 감사합니다.
  • … 및 xargs는 원하는 경우 xargs -I {} sh -c '...' sh {}로도 사용할 수 있습니다. 원하는 경우 -P로 병렬 작업을 실행할 수 있습니다.

Answer

수정 :이 답변은 선호되지 않음 이지만 잠재적으로 위험한 함정을 비교하고 설명하기 위해 여기에 남겨 둡니다. bash 스크립팅에서.


bash (또는 다른 셸)을 -exec 명령으로 넣을 수 있습니다.

 find -type -f -name "*.txt" -exec bash -c "egrep -iH something "{}" | egrep somethingelse | egrep other" \;  

이 방식의 단점 중 하나는 명령이 복잡 해짐에 따라 중첩 인용 문제가 발생할 가능성이 있습니다. 이를 방지하려면 for -loop로 분리 할 수 있습니다.

 for i in $(find -type -f -name "*.txt"); do if egrep -iH something "$i" | egrep somethingelse | egrep other; then echo "Found something: $i" fi done  

댓글

  • 첫 번째는 정확히 제가 찾던 것입니다. 내 필요에 따라 입력하기에 매우 간단하고 작습니다. 감사합니다.
  • for 루프는 매우 나쁜 생각입니다. bash 함정 # 1 .
  • 첫 번째 명령에서이 "{}"는 코드 삽입으로 이어질 수도 있습니다. 저와 저기 '에서 문자 그대로 " & rm -rf ~ & : ".txt라는 파일을 받았다고 가정 해보십시오. 다행히 -type -f는 유효하지 않습니다. 방금 홈 디렉토리를 저장했습니다. 오타를 수정하고 다시 시도하십시오. 🙂 terdon이 제대로 해냈습니다 : find … -exec sh -c '… "$1" …' foo {} \;.
  • 정보 감사합니다! 예, -type -ffind를 사용할 때 지속적으로 작성하는 오타이며 ' 내 대답에서 눈치 채지 못합니다. 이런. terdon '의 답변이 더 낫지 만 ' 비교 목적으로 남겨 두겠습니다.
  • @terdon : tx mywiki.wooledge.org 페이지를 참조하십시오. ' 여러 GP를 한 곳에 깔끔하게 요약하는 것이 좋습니다.

답글 남기기

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