디렉터리(및 모든 하위 디렉터리)의 모든 파일에서 문자열을 검색하려고 합니다. 파일에 해당 문자열이 있으면 다른 문자열(이 경우에는 "snake")이 나타나는 횟수를 검색하여 출력하고 싶습니다. 또한 "뱀"이 나타나는 파일의 행을 출력하고 싶습니다.
echo "Files with Reptile:"
find . -type f -name "*.txt" -exec grep -l "Reptile" {} \;
내 과제는 중괄호 뒤에 추가 grep 명령을 추가하는 방법입니다. 몇 가지를 시도했지만 "-exec 누락된 인수" 오류가 계속 발생합니다.
내가 이 발견에 너무 많은 것을 집어넣으려고 하는 걸까?
감사해요
답변1
다음을 시도해 볼 수 있습니다.
$ find . -type f -name "*.txt" -exec sh -c "grep -l "Reptile" {} | xargs -I% grep -Hn snake %" \;
./rep1.txt:2:snake
./rep2.txt:5:another snake
출력에는 콜론으로 구분된 목록이 포함됩니다. 여기서 첫 번째 인수는 파일 이름(인수에서 -H
까지 grep
)이고, 두 번째 인수는 원하는 용어가 나타나는 행 번호(인수에서 -n
까지 grep
)이며, 세 번째 인수는 행 자체입니다.
xargs
외부로 이동할 수 있어 find
다음을 제공합니다.
$ find . -type f -name "*.txt" -exec grep -l "Reptile" {} \; | xargs -i grep -Hn snake {}
(동일) -i
매개변수는 더 이상 사용되지 않지만 편의상 자주 사용됩니다.xargs
-I{}
입력 파일:
$ tail -n+1 rep*.txt
==> rep1.txt <==
Reptile
snake
iguana
crocodile
==> rep2.txt <==
Reptile
alligator
turtle
another snake
komodo dragon
==> rep3.txt <==
Reptile
lizard
gecko
잘못된 파일 이름을 처리해야 하는 경우 xargs를 병합 print0
하고 -0
선택하는 것을 고려할 수 있습니다.
답변2
여러 -exec
조건자. 명령이 성공하는 경우에만 해당 되므로 -exec
첫 번째 명령에 대해 특별한 작업을 수행할 필요가 없습니다 grep
.
find ... -exec grep -q "Reptile" {} \; -exec grep -Hn snake {} \;
답변3
find . -type f -name "*.txt" -exec sh -c 't=$(mktemp)
for fi
do
if grep -q Reptile "$fi"
then
echo "$fi contains Reptile"
grep snake "$fi" | tee "$t"
echo "snake appeared on $(wc -l < "$t") line(s)"
fi
done
rm -f "$t"
' sh {} +
이는 "snake"라는 단어가 포함되어 있지 않더라도 단어/문자열 "Reptile"을 포함하는 파일 이름을 보고하고 "snake"를 포함하는 줄 수를 독립적으로 보고합니다.
이런, 질문을 잘못 읽었고 필수 사항인 줄 알았습니다. 꺼내는 것은 쉽습니다.
find . -type f -exec sh -c '
for fi
do
if grep -q Reptile "$fi"
then
echo "$fi contains Reptile"
grep snake "$fi"
fi
done
' sh {} +
필요한 경우 -n
옵션 을 추가할 수 있습니다.grep snake
이는 거의 모든 유효한 파일 이름을 처리해야 합니다. 공백으로 시작하거나 개행 문자를 포함하는 파일 이름에 대한 다른 답변을 확인하세요.