Bash를 사용하면 읽은 적이 없는(또는 수정 시간이 읽은 시간과 동일한) 파일 목록을 얻을 수 있습니까?

Bash를 사용하면 읽은 적이 없는(또는 수정 시간이 읽은 시간과 동일한) 파일 목록을 얻을 수 있습니까?

예를 들어, 폴더가 있는 경우 해당 폴더와 해당 하위 폴더에 있는 한 번도 읽은 적이 없는 모든 파일의 목록을 얻을 수 있습니까?

하지만 이것이 가능합니까? (실제로 파일이 작성될 때 "마지막 액세스 시간"이 업데이트되기 때문입니다). 이 경우 마지막 액세스 시간이 마지막 수정 시간과 동일한 모든 파일의 목록을 가져오는 것도 가능합니다.

답변1

다음 perl스크립트는 atime <= mtime인 모든 파일(즉, 마지막 쓰기 이후 읽지 않은 파일)을 찾아 전체 경로를 인쇄합니다.

$ perl -MFile::Find=find -e 'find {
   wanted => sub {my @s=stat; print "$_\n" if $s[8]<=$s[9]},
   no_chdir => 1
}, @ARGV' files and dirs ...

또는 GNU find의 이식 불가능한 기능을 사용하십시오.

$ find [files and dirs ...] -printf '%A@ %T@  %p\n' |
  awk '$1 <= $2 { print substr($0, index($0, "  ")+2) }'

find버전은 atime과 mtime 사이의 1초 미만의 차이도 처리하므로 더욱 정확합니다. 개행 문자가 포함된 파일 이름은 처리하지 않습니다. 이는 ;와 함께 -printf '...\0'GNU awk( gawk)를 사용하여 RS="\0"해결할 수 있습니다. 그러나 삽입된 개행 문자가 명확하게 표시되는 출력 형식을 결정해야 합니다.

이 중 어느 것에서나 이 작업을 수행할 수 있습니다 bash. 이를 수행하는 것은 순전히 bash독자에게 연습으로 남겨집니다. ;-)

파일 타임스탬프에 대한 참고 사항:

이 모든 것은 파일 시스템이 MS_NOATIME.

atime은 파일을 방금 열거나 썼을 때 업데이트되지 않고, 어떤 방식으로든(read(2), pread(2), execve(2) 등을 통해) 읽을 때만 업데이트됩니다.

또한 유닉스에는 "생성 시간"이 없습니다. ctime은 상태의 시간입니다.변화메타데이터가 변경되거나 파일이 기록될 때마다 업데이트됩니다.

최신 Linux 커널(>4.11)은 다음을 통해 확인할 수 있는 파일 생성/생성 시간도 알고 있습니다.통계(2)상호 작용. 그러나 이는 비표준이며 아직 대부분의 배포판에서 지원되지 않습니다.

관련 정보