여러 하위 디렉터리에 있는 여러 파일에서 마지막 일치 항목을 찾았지만 파일 경로도 출력하고 싶지만 그렇게 할 수 없습니다. 어떻게 바꿔야 해?
find subdirprefix* -name log -exec sh -c "tac '{}' | grep -m1 'search string' " \;
이렇게 하면 각 파일의 마지막 항목과 파일 경로(전체 경로가 아닌 시작 디렉터리 기준)가 출력됩니다.
즉, 출력은 다음과 같아야 합니다
[..]search string[..] : subdirprefix1/log
[..]search string[..] : subdirprefix2/log
[..]search string[..] : subdirprefix3/log
답변1
최소한 GNU grep을 사용하면 -H
출력에 원래 파일 이름으로 태그를 지정할 수 있습니다. 입력이 stdin을 통해 파이프될 때 작동하도록 하는 비결은 해당 --label
옵션을 사용하는 것입니다.
예를 들어
find subdirprefix* -name log -exec sh -c '
tac "$1" | grep -H --label="$1" -m1 "search string"
' find-sh {} \;
또는 (약간 더 효율적)
find subdirprefix* -name log -exec sh -c '
for f; do tac "$f" | grep -H --label="$f" -m1 "search string"; done
' find-sh {} +
'{}'
(나는 그것을 쉘 스크립틀릿 밖으로 옮기고 위치 인수로 전달하는 자유를 얻었습니다 .)