find exec 및 while 루프 연결

find exec 및 while 루프 연결

반환되는 결과에 "경고:" 또는 "오류:" 텍스트가 있는 파일만 포함되도록 find 명령을 스택하려고 합니다. 또한 특정 형식의 결과가 필요하므로 exec stat이를 사용하고 있습니다.

-exec stat작동하는 버전을 얻을 수 있지만 while 루프에서 이를 사용하여 특정 문자열을 공식화할 수 있어야 합니다. 그러면 -exec stat쉘에서 메시지가 표시됩니다 >. 작동하지 않는 부분은 아래에 굵은 글씨로 표시되어 있습니다.

나는 이것들을 개별적으로 작동시킬 수 있습니다. 함께 할 수 없습니다.

제가 작업하고 있는 작업의 예는 다음과 같습니다.

find . -type f -exec grep -li error: {} \; | while read -r file; do ls -l "$file"; done

이제 파일을 특정 시간, 유형 등으로 제한하는 다른 프로세스로 이를 해결하려고 합니다. 잘 안 됐어요:

/my/directory/here/를 찾았습니다. -type f -name *.log -mmin -480 -mmin +60 -exec grep -li 경고: {} \ -exec grep -li 오류: {} \;|-r 파일을 읽을 때 -exec stat -c "$file" '%n|%y|%x|%s|%U|%u' {} \;완료

-exec statwhile 루프에서 이를 제거하면 모든 것이 작동합니다. 간단한 것으로 바꾸면 ls -l결과가 나에게 반환됩니다. 이제 쉘은 나에게 명령 프롬프트를 제공합니다.

내가 제대로 하고 있지 않다는 건 알지만, 무엇을 먼저 고쳐야 할지 지금은 모르겠습니다.

답변1

find /my/directory/here/ -type f -name '*.log' -mmin -480 -mmin +60 \
    -exec grep -qi warning: {} \; \
    -exec grep -qi error: {} \; \
    -exec stat -c '%n|%y|%x|%s|%U|%u' {} +

즉, 두 grep명령의 실제 출력이 필요하지 않고 종료 상태만 필요하므로 루프가 필요하지 -q않습니다 . 여러 파일에서 호출될 수 있으므로 현재 디렉터리에서 그러한 이름으로 확장되지 않도록 패턴을 인용합니다 .-lwhilestat-exec stat ... {} +*.log

관련된:

동일한 작업을 수행하는 또 다른 방법:

find /my/directory/here/ -type f -name '*.log' -mmin -480 -mmin +60 \
    -exec sh -c '
        for pathname do
            if grep -qi warning: "$pathname" &&
               grep -qi error: "$pathname"
            then
                stat -c "%n|%y|%x|%s|%U|%u" "$pathname"
            fi
        done' sh {} +

이는 하위 쉘 내에서 실행되는 루프 find에 대한 경로 이름 생성기 로 사용됩니다. for그러나 이는 stat두 패턴 모두에 대한 일치 항목을 포함하는 각 파일에 대해 한 번씩 호출되므로 효율성이 약간 떨어집니다.

답변2

GNU의 grep(1)은 재귀적인 패턴 일치를 수행할 수 있습니다:

grep -R warning that-dir

아래의 모든 파일을 확인하십시오 that-dir.

관련 정보