Usando o Bash, é possível obter uma lista de arquivos que nunca foram lidos (ou a hora da modificação é igual ao tempo de leitura)?

0

Digamos que, se houver uma pasta, é possível obter uma lista de todos os arquivos na pasta e em suas subpastas, que nunca foram lidos uma vez?

Mas é possível? (porque o "último horário de acesso" é realmente atualizado quando o arquivo foi gravado). Se for esse o caso, obter uma lista de todos os arquivos em que o último horário de acesso é igual ao horário da última modificação também será executado.

    
por 太極者無極而生 05.11.2018 / 00:29

1 resposta

4

O script perl a seguir encontrará todos os arquivos que possuem o seu atime < = mtime (ou seja, arquivos que não foram lidos desde a última vez que foram gravados) e imprimem seus caminhos completos:

$ 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 ...

Ou, usando recursos não suportáveis do GNU find:

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

A versão find é mais precisa, porque também lida com diferenças de subsegundos entre o atime e o mtime. Ele não irá lidar com nomes de arquivos que contenham novas linhas - isso pode ser corrigido usando -printf '...gawk' e GNU awk ( RS="bash" ) com bash ; mas então terá que ser decidido em um formato de saída onde as novas linhas embutidas serão claramente mostradas.

Você pode usar qualquer um deles em MS_NOATIME ; fazer isso em %code% puro é deixado como um exercício para o leitor; -)

Observação sobre carimbos de data e hora do arquivo:

Tudo isso pressupõe que o atime está realmente funcionando; isso pode não ser o caso se o sistema de arquivos estiver montado com %code% .

O atime não é atualizado quando o arquivo é aberto ou gravado, mas apenas quando é lido de uma maneira ou de outra (por read (2), pread (2), execve (2), etc). / p>

Além disso, não há "tempo de criação" no unix; a hora é a hora do status alteração e será atualizada sempre que seus metadados forem alterados ou quando o arquivo for gravado.

Os kernels linux recentes (> 4.11) também sabem sobre a hora de criação / nascimento de um arquivo, acessível através do interface statx (2) . Mas isso não é padrão e ainda não é suportado na maioria das distribuições.

    
por 05.11.2018 / 01:13

Tags