Por que o find -mtime +1 retorna somente arquivos com mais de 2 dias?

93

Estou com dificuldades de entender por que o find interpreta os tempos de modificação do arquivo da maneira como funciona. Especificamente, não entendo por que o -mtime +1 não mostra arquivos com menos de 48 horas.

Como teste de exemplo, criei três arquivos de teste com diferentes datas modificadas:

[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3

Em seguida, executei a pesquisa com a opção -mtime +1 e obtive a seguinte saída:

[root@foobox findtest]# find -mtime +1
./foo3

Eu então corri com o -mmin +1440 e obtive a seguinte saída:

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

De acordo com a página man do find, entendo que isso é um comportamento esperado:

 -mtime n
        File’s  data was last modified n*24 hours ago.  See the comments
        for -atime to understand how rounding affects the interpretation
        of file modification times.


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

Isso ainda não faz sentido para mim. Portanto, se um arquivo tiver 1 dia, 23 horas, 59 minutos e 59 segundos, find -mtime +1 ignora tudo isso e apenas o considera como 1 dia, 0 horas, 0 minutos e 0 segundo de idade? Nesse caso, não é tecnicamente mais antigo que 1 dia e é ignorado?

Não ... computa.

    
por Mike B 25.09.2013 / 17:53

7 respostas

69

Bem, a resposta simples é, eu acho, que a sua implementação find está seguindo o padrão POSIX / SuS, que diz que deve se comportar dessa maneira. Citando SUSv4 / IEEE Std 1003.1, edição 2013, "localizar" :

-mtime n
     The primary shall evaluate as true if the file modification time subtracted
     from the initialization time, divided by 86400 (with any remainder discarded), is n.

(Em outro lugar nesse documento, explica que n pode realmente ser +n e o significado disso como "maior que").

Quanto ao motivo pelo qual a norma diz que deve se comportar dessa maneira - bem, eu acho que no passado um programador era preguiçoso ou não pensava nisso, e apenas escrevia o código C (current_time - file_time) / 86400 . C aritmética inteira descarta o restante. Os scripts começaram dependendo desse comportamento e, portanto, foram padronizados.

O comportamento da especificação também seria portátil para um sistema hipotético que armazenava apenas uma data de modificação (não a hora). Não sei se tal sistema existiu.

    
por 25.09.2013 / 18:08
71

O argumento para -mtime é interpretado como o número de dias inteiros na idade do arquivo. -mtime +n significa estritamente maior que , -mtime -n significa estritamente menor que.

Note que com o Bash, você pode fazer o mais intuitivo:

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

para encontrar arquivos mais antigos e mais recentes que 24 horas, respectivamente.

(Também é mais fácil do que digitar um argumento fracionário para -mtime para quando você deseja resolução em horas ou minutos.)

    
por 04.02.2014 / 02:40
36

Períodos de 24 horas fracionários são truncados! Isso significa que "find -mtime +1" diz para corresponder arquivos modificados dois ou mais dias atrás.

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

O seguinte pode funcionar apenas no GNU?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago
    
por 17.12.2014 / 21:59
18

So if a file is 1 day, 23 hours, 59 minutes, and 59 seconds old, find -mtime +1 ignores all that and just treats it like it's 1 day, 0 hours, 0 minutes, and 0 seconds old?

Sim. Como man find diz, "qualquer parte fracionária é ignorada". Se você dividir "1 dia, 23 horas, 59 minutos e 59 segundos" a "24 horas", você poderá obter 1,9999, mas a parte .9999 será removida e, de repente, o arquivo terá apenas 1 dia de duração.

    
por 25.09.2013 / 18:08
15

-mtime N significa arquivos cuja idade A em dias satisfaz N A < N +1. Em outras palavras, -mtime N seleciona arquivos que foram modificados pela última vez entre N e N +1 dias atrás.

-mtime -N significa arquivos cuja idade A satisfaz A < N , isto é, arquivos modificados há menos de N dias atrás. Menos intuitivamente, -mtime +N significa arquivos cuja idade A satisfaz N +1 <,> , ou seja, arquivos modificados pelo menos N +1 dias atrás.

Por exemplo, -mtime 1 seleciona arquivos que foram modificados entre 1 e 2 dias atrás. -mtime +1 seleciona arquivos que foram modificados há pelo menos dois dias. Para obter arquivos modificados pelo menos um dia atrás, use -mtime +0 .

A descrição "foi modificada pela última vez n * 24 horas atrás" é apenas uma aproximação e não é muito clara.

Se você achar essas regras difíceis de lembrar, use um arquivo de referência.

touch -d '1 day ago' cutoff
find . -newer cutoff

(A sintaxe “1 dia atrás” requer o% GNUtouch.)

    
por 02.05.2015 / 22:57
5

Use -mmin, -amin, etc para obter resultados exatos

    
por 29.09.2013 / 08:47
-2

Se você deseja arquivos com exatamente 48 horas de vida, e não dois dias, adicione --daystart no comando find . Isso ajudará você.

find . type -f -daystart -mtime +1
    
por 13.01.2016 / 11:17