Como definir (find) atime em segundos?

6

Como defino -atime em milissegundos, segundos ou minutos? O padrão é dias:

-atime n
File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.

Gostaria de executar um cron job, digamos, por hora, para verificar se os arquivos em um diretório específico foram acessados dentro desse período de tempo. A inserção de hora como decimal não parece funcionar, por exemplo

find . -atime 0.042 -print

Mas talvez exista uma solução melhor, de qualquer maneira - outro comando, talvez? Ou talvez isso não possa ser feito .. para localizar arquivos modificados nos últimos minutos x , há -mmin que permite definir o tempo em minutos. Talvez a ausência de tal opção para o tempo de acesso implique que a informação não é armazenada da mesma maneira?

Estou usando o Ubuntu 16.04.

    
por Ville 20.01.2017 / 20:43

2 respostas

7

Observe que quando você executa -mtime <timespec> , o <timespec> verifica a idade do arquivo no momento em que find foi iniciado.

A menos que você o execute em uma árvore de diretórios muito pequena, find levará vários milissegundos (se não segundos ou horas) para rastrear a árvore de diretórios e fazer um lstat() em cada arquivo. Portanto, ter uma precisão de menos de um segundo não faz necessariamente muito sentido.

Observe também que nem todos os sistemas de arquivos suportam carimbos de hora com granularidade de subsegundo.

Dito isto, existem algumas opções.

Com o find de muitos BSDs e o de schily-tools , você pode fazer:

find . -atime -1s

Para localizar arquivos que foram acessados pela última vez há menos de um segundo (comparado a quando o find foi iniciado).

com zsh :

ls -ld -- **/*(Dms-1)

Para granularidade de subsegundo, com ferramentas GNU, você pode usar um arquivo de referência cujo tempo de execução seja definido com touch :

touch -ad '0.5 seconds ago' ../reference
find . -anewer ../reference

Ou com versões recentes de perl :

perl -MTime::HiRes=lstat,clock_gettime -MFile::Find -le '
  $start =  clock_gettime(CLOCK_REALTIME) - 0.5;
  find(
    sub {
      my @s = lstat $_;
      print $File::Find::name if @s and $s[8] > $start
    }, ".")'
    
por 20.01.2017 / 22:13
8

Com o GNU find, você pode usar -amin em vez de -atime . Como você pode imaginar, é "O arquivo foi acessado pela última vez há alguns minutos atrás".

Dito isso, esteja ciente de que a maioria dos sistemas modernos usa a opção relatime para sistemas de arquivos, que salva gravações de metadados atualizando apenas se o arquivo foi realmente modificado desde o último acesso ou se um limite (geralmente 24 horas) passou.

Assim, você provavelmente desejará alterar isso para o sistema de arquivos em questão ou procurar outra abordagem. incrond é uma maneira útil de configurar scripts para disparar em atividades de sistema de arquivos sem a necessidade de escreva seu próprio daemon.

    
por 20.01.2017 / 21:29