반환되는 결과에 "경고:" 또는 "오류:" 텍스트가 있는 파일만 포함되도록 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 stat
while 루프에서 이를 제거하면 모든 것이 작동합니다. 간단한 것으로 바꾸면 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
않습니다 . 여러 파일에서 호출될 수 있으므로 현재 디렉터리에서 그러한 이름으로 확장되지 않도록 패턴을 인용합니다 .-l
while
stat
-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
.