GNU find - [cma] opção de horário e horário de verão

6

No GNU find man, você pode ler sobre a opção -atime :

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

Tenha em atenção a utilização de "n * 24 horas atrás" em vez de "n days ago".

Agora, isso está me deixando preocupada com o que acontece quando a mudança para o horário de inverno nesse dia é de 25 horas (e ocasionalmente há dias que duram 24 horas e 1 segundo quando há um segundo).

Se eu tiver uma tarefa cron diária usando find -daystart -atime +1 , será que falta arquivos acessados durante essa hora repetida?

    
por 1lus1loppa 25.09.2015 / 14:54

1 resposta

5

Para -daystart , o manual diz:

-- Option: -daystart

Measure times from the beginning of today rather than from 24 hours ago. So, to list the regular files in your home directory that were modified yesterday, do

find ~/ -daystart -type f -mtime 1

The '-daystart' option is unlike most other options in that it has an effect on the way that other tests are performed. The affected tests are '-amin', '-cmin', '-mmin', '-atime', '-ctime' and '-mtime'. The '-daystart' option only affects the behaviour of any tests which appear after it on the command line.

O que isso significa se você executar:

find . -daystart -mtime 1

no dia seguinte ao horário de inverno (2015-10-25 na Europa este ano), que deve fornecer os arquivos modificados pela última vez entre 2015-10-25 01:00 (a primeira ocorrência desse período) e 2015-10-25 23:59:59.999... .

Se executar como

find . -daystart -mtime 0

em 2015-10-25, espera-se que você obtenha os arquivos modificados entre 00:00 e 22:59:59, mas fazer um teste simples (com findutils 4.4.2) mostra que ele retorna arquivos modificados entre as primeiras 01:00 e 23:59:59 (a menos que seja executado antes da mudança de horário).

$ find . -printf '%TFT%TT %p\n'
2015-09-25T14:28:25.4868761490 .
2015-10-25T00:02:00.0000000000 ./a
2015-10-25T23:43:00.0000000000 ./c
2015-10-25T12:42:00.0000000000 ./b
$ NO_FAKE_STAT=1 faketime -m '2015-10-25 12:23' find . -daystart -mtime 0
./c
./b
$ NO_FAKE_STAT=1 faketime -m '2015-10-25 00:32' find . -daystart -mtime 0
./a
./b
$ NO_FAKE_STAT=1 faketime -m '2015-10-25 12:23' find . -daystart -mtime 1
./a

Em qualquer caso, a declaração Então, para listar os arquivos regulares em seu diretório inicial que foram modificados ontem acima, nem sempre é verdade.

Sem -daystart , a verificação é para arquivos modificados em unidades de 24 horas. Então, se você executar em 12:43 em 2015-10-25, find . -mtime 0 fornecerá arquivos modificados entre 2015-10-24 13:43 e agora.

Uma maneira mais confiável de fornecer os arquivos que foram modificados pela última vez ontem seria:

 find . -newermt 'yesterday 0' ! -newermt 'today 0'

Observe que ele inclui os arquivos que foram modificados pela última vez hoje às 00: 00: 00.0000000000 e não os que estavam naquele momento ontem. Infelizmente não há predicado -oldermt .

Observe que a função zsh do age é usada em globs como:

$ autoload age # in ~/.zshrc
$ ls -ld -- *(age,yesterday,)

tem problemas semelhantes.

    
por 25.09.2015 / 15:35

Tags