.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