모든 .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
댓글
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 -f
는find
를 사용할 때 지속적으로 작성하는 오타이며 ' 내 대답에서 눈치 채지 못합니다. 이런. terdon '의 답변이 더 낫지 만 ' 비교 목적으로 남겨 두겠습니다. - @terdon : tx mywiki.wooledge.org 페이지를 참조하십시오. ' 여러 GP를 한 곳에 깔끔하게 요약하는 것이 좋습니다.
xargs
는 원하는 경우xargs -I {} sh -c '...' sh {}
로도 사용할 수 있습니다. 원하는 경우-P
로 병렬 작업을 실행할 수 있습니다.