heaq
*.md 파일에서 단어가 포함된 모든 줄을 찾으려고 합니다.
$ for i in $(find . -regex ".*md$"); do grep -i "heaq"; done
#pending
#pending
그러나 아직 해결되지 않은 상태입니다.
내 코드에 무슨 문제가 있나요?
답변1
이것은 grep
"미정"입니다. grep
런타임에 읽을 파일 이름이 없으면 표준 입력을 읽습니다 . 표준 입력에 데이터를 제공하지 않으면 "멈춤"으로 나타납니다.
또한 출력을 반복합니다 find
. 이는 우아하지 않으며(모든 경로 이름을 찾을 때까지 루프가 실행되지 않음 find
) 위험합니다(경로 이름이 공백으로 분할되고 쉘이 파일 이름 글로빙을 수행합니다).
grep
대신 특정 파일 이름 접미사가 있는 모든 파일에 대해 실행 하려면 다음을 수행하십시오.
find . -type f -name '*.md' -exec grep -iF 'heaq' {} +
저는 이것을 패턴이 파일 이름 접미사가 있는 파일 이름과 만 일치하는 -regex
표준 테스트로 변경했습니다 . 또한 일반 파일에서만 실행하는 것이 합리적이기 때문에 이것을 추가했습니다 ( 디렉토리가 아닌 다른 파일에서 실행 하도록 변경하고 싶을 수도 있음 ).-name
.md
-type f
grep
-type f
! -type d
발견된 경로명을 일괄적으로 실행합니다 grep
. 정규 표현식이 아닌 문자열을 일치시키기 때문에 with를 -exec
사용합니다 . 하위 문자열이 아닌 단어를 일치시키려면 추가해야 할 수도 있습니다.-F
grep
-w
관련된:
답변2
파일 이름을 다음으로 전달해야 합니다.grep
매우 좋아하다
$ for i in $(find . -regex ".*md$"); do grep -i "heaq" $i; done
당신은 또한 사용할 수 있습니다
% grep -i -n "heaq" $(find . -regex ".*md$")
-n
grep이 일치하는 줄 번호를 인쇄하도록 합니다.