for 루프가 보류 상태이고 실행되지 않습니다.

for 루프가 보류 상태이고 실행되지 않습니다.

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 fgrep-type f! -type d

발견된 경로명을 일괄적으로 실행합니다 grep. 정규 표현식이 아닌 문자열을 일치시키기 때문에 with를 -exec사용합니다 . 하위 문자열이 아닌 단어를 일치시키려면 추가해야 할 수도 있습니다.-Fgrep-w

관련된:

답변2

파일 이름을 다음으로 전달해야 합니다.grep

매우 좋아하다

$ for i in $(find . -regex ".*md$"); do grep -i "heaq" $i; done

당신은 또한 사용할 수 있습니다

% grep -i -n "heaq" $(find . -regex ".*md$")

-ngrep이 일치하는 줄 번호를 인쇄하도록 합니다.

관련 정보