특정 폴더에서 최근 생성된 파일을 검색하고 내용의 패턴을 파악해야 합니다. 지금까지 나는 다음 명령을 사용하여 상당한 성공을 거두었습니다.
find /var/log/folder -type f -printf '%T+ %p\n' | sort | tail -n1 | xargs grep 'string to find'
일치하는 최신 파일을 찾았지만 표준 출력에 예상치 못한 줄이 표시됩니다.
$ find /var/log/folder -type f -printf '%T+ %p\n' | sort | tail -n1 | xargs grep 'string to find'
grep: 2016-05-12+20:01:59.0570667340: No such file or directory
/var/log/folder/file:string to find
"해당 파일 또는 디렉터리 없음" 줄이 없도록 명령을 어떻게 변경할 수 있습니까?
답변1
ls -1rt /path/to/files/ | tail -n1
최신 파일(수정 시간 기준)은 디렉토리에서 찾을 수 있습니다. 이를 인수로 전달합니다 grep
.
grep 'string to find' "$(ls -1rt /path/to/files/ | tail -n1)"
답변2
공백이 있는 이름에 안전한 버전은 다음과 같습니다.
find /var/log/folder -type f -printf '%T@ %p\0' | sort -rz | sed -Ezn '1s/[^ ]* //p' | xargs --null grep string
작동 방식:
find /var/log/folder -type f -printf '%T@ %p\0'
그러면 파일을 찾아 수정 시간을 초 단위로 인쇄하고 그 뒤에 공백과 이름, 널 문자가 옵니다.
sort -rz
null로 구분된 데이터를 정렬합니다.
sed -Ezn '1s/[^ ]* //p'
sed -z
널 문자로 구분된 행을 처리합니다. 이는 최신 파일의 이름만 인쇄합니다.xargs --null grep string
그러면 null로 구분된 파일 이름을 읽고 문자열에 대한 grep을 읽습니다.
답변3
그리고 zsh
:
grep string /var/log/**/*(.om)
한정자를 사용 하면 om
파일은 일치 항목을 다음으로 제한 하는 것처럼 최신 항목부터 가장 오래된 항목까지 수정 시간을 o
기준으로 정렬됩니다 .m
ls -t
.
정기적인문서. 마지막 날이나 마지막 주 등 으로 마지막으로 수정된 파일 m-1
에 제한을 추가할 수 있습니다 .mh-1
h
디렉토리가 다른 곳으로의 심볼릭 링크 이고 /var/log
이를 뒤에 두고 싶다면(예: find find -L
/ ) 로 find -follow
바꿀 수 있습니다 .**/
***/
일치하는 첫 번째 파일을 찾은 후 중지하려면 다음을 사용할 수 있습니다 gawk
.
gawk '/string/ {print FILENAME": "$0; found++}
ENDFILE {if (found) exit}' /var/log/**/*(.om)