find -exec의 파이프 명령?

find -exec의 파이프 명령?

.txt모든 파일을 찾고 특정 문자열을 검색하고 싶다고 가정해 보겠습니다 . 나는 그것을 할 것이다:

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

다음과 같이 더 복잡한 필터링을 수행하려면 다음을 수행하십시오.

egrep something file.txt | egrep somethingelse | egrep other

내부에서 -exec를 찾으시겠습니까? (혹은 유사)

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

답변1

find에서 이 작업을 수행해야 하는 경우 셸을 호출해야 합니다.

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

답변2

편집 : 이 답변은선호하지 않음, 그러나 bash 스크립트의 잠재적으로 위험한 함정을 비교하고 설명하기 위해 여기에 남겨졌습니다.


bash다음 명령으로 (또는 다른 쉘)을 제공할 수 있습니다 -exec.

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

이것의 한 가지 단점은 명령이 더 복잡해지면 참조 문제가 더 많이 중첩될 가능성이 있다는 것입니다. 이를 방지하려면 for루프로 끊을 수 있습니다.

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

관련 정보