특정 문자열이 포함된 디렉토리에서 최신 파일을 찾는 방법은 무엇입니까?

특정 문자열이 포함된 디렉토리에서 최신 파일을 찾는 방법은 무엇입니까?

특정 폴더에서 최근 생성된 파일을 검색하고 내용의 패턴을 파악해야 합니다. 지금까지 나는 다음 명령을 사용하여 상당한 성공을 거두었습니다.

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기준으로 정렬됩니다 .mls -t.정기적인문서. 마지막 날이나 마지막 주 등 으로 마지막으로 수정된 파일 m-1에 제한을 추가할 수 있습니다 .mh-1h

디렉토리가 다른 곳으로의 심볼릭 링크 이고 /var/log이를 뒤에 두고 싶다면(예: find find -L/ ) 로 find -follow바꿀 수 있습니다 .**/***/

일치하는 첫 번째 파일을 찾은 후 중지하려면 다음을 사용할 수 있습니다 gawk.

gawk '/string/ {print FILENAME": "$0; found++}
      ENDFILE  {if (found) exit}' /var/log/**/*(.om)

관련 정보