각각 깊이가 다른 여러 하위 디렉터리가 있습니다. 특정 파일 형식(예 *.out
: . 어떻게 이를 달성할 수 있나요?
나는 시도했다:
grep -r 'string' **/*.out | tail -1
하지만 이것은 마지막 파일의 마지막 문자열만 제공합니다.
답변1
하위 디렉터리의 상위 디렉터리에 있다고 가정합니다.
find . -type f -name '*.out' -exec sh -c '
for f do
grep "string" /dev/null "$f" | tail -n 1
done
' sh {} +
답변2
나는 다음과 같은 것을 사용할 것입니다 :
for i in `find . -name "*.out" -type f`;
do
grep -l 'string' $i
grep 'string' $i|tail -1
done
첫 번째 grep을 사용하면 파일 이름과 아래 내용(두 번째 grep)을 얻을 수 있습니다.
\[*?
파일 이름에 공백이나 .see 가 포함되지 않는 한cuonglm의 답변강력한 솔루션을 위해.
답변3
zsh
GNU 시스템 에서 :
for f (**/*.out(.)) tac < $f | grep --label=$f -m1 string
답변4
도구를 사용하면 gnu
단일 호출을 사용할 수 있습니다 gawk
.
awk '/pattern/{l=$0} ENDFILE{if (l) {print FILENAME ":" l; l=""}}' **/*.out
(라인이 일치하면 l
각 파일의 끝 부분에 저장하고, l
비어 있지 않으면 파일 이름을 인쇄한 l
다음 재설정합니다 l
.)
또는 sed
:
sed -ns '/pattern/h;${x;//{F;p}}' **/*.out
(줄이 일치하면 h
이전 공간으로 복사하고 위도 $
줄은 x
패턴 공간으로 공간을 유지하도록 변경합니다. 일치하면 파일 이름과 줄을 p
인쇄합니다 .) 출력은 다르지만 - 파일 이름과 해당 마지막 일치 줄은 다른 줄에 있습니다. 하지만 다른 파이프 로 파이프되는 경우F
sed
sed -ns '/pattern/h;${x;//{F;p}}' **/*.out |sed '$!N;s/\n/:/'
grep
출력 1 을 시뮬레이션합니다 .
위의 가정세게 때리다(섹션 4 shopt -s globstar
) 또는다루기 힘든. 숨겨진 파일을 포함하려면 shopt -s dotglob
(세게 때리다) 또는 setopt dotglob
(다루기 힘든).
1: 파일 이름에 개행 문자가 포함되어 있지 않은 경우.