Estou lutando para entender por que a find
modificação dos arquivos de interpretação interpreta o tempo como acontece. Especificamente, não entendo por que o -mtime +1
arquivo não mostra arquivos com menos de 48 horas.
Como exemplo de teste, criei três arquivos de teste com diferentes datas de modificação:
[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, corri find com o -mtime +1
switch e obtive a seguinte saída:
[root@foobox findtest]# find -mtime +1
./foo3
Em seguida, executei o find com o -mmin +1440
e obtive a seguinte saída:
[root@foobox findtest]# find -mmin +1440
./foo3
./foo2
De acordo com a página de manual do find, entendo que este é 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 o trata como se tivesse 1 dia, 0 horas, 0 minutos e 0 segundos? Nesse caso, não é tecnicamente mais antigo que 1 dia e ignorado?
Não computa.
fonte
Respostas:
Bem, a resposta simples é, eu acho, que sua implementação de localização está seguindo o padrão POSIX / SuS, que diz que deve se comportar dessa maneira. Citando no SUSv4 / IEEE Std 1003.1, edição de 2013, "find" :
(Em outro lugar desse documento, ele explica que
n
pode realmente ser+n
, e o significado disso como "maior que").Quanto ao porquê da norma diz que deve se comportar dessa forma, bem, eu acho muito tempo no passado um programador era preguiçoso ou não pensar nisso, e apenas escreveu o código C
(current_time - file_time) / 86400
. A aritmética de número inteiro C descarta o restante. Os scripts começaram dependendo desse comportamento e, portanto, foram padronizados.O comportamento especificado também seria portável para um sistema hipotético que armazenava apenas uma data de modificação (não hora). Não sei se esse sistema existe.
fonte
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.Observe que, com o Bash, você pode fazer o mais intuitivo:
para encontrar arquivos mais antigos e mais recentes que 24 horas, respectivamente.
(Também é mais fácil do que digitar um argumento fracionário
-mtime
para quando você deseja resolução em horas ou minutos.)fonte
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
$(())
é uma sintaxe aritmética de casca simples, não é específica para o Bash, cf. pubs.opengroup.org/onlinepubs/009695399/utilities/…This chapter describes the syntax of that command language as it is used by the sh utility and [...]
. Como o Bash é um SH "estendido", ele suporta essa sintaxe, mas alguns outros shells não, por exemplo, csh / tcsh./bin/sh
.Períodos fracionários de 24 horas são truncados! Isso significa que "find -m +1" diz corresponder aos arquivos modificados há dois ou mais dias.
O seguinte pode funcionar apenas no GNU?
fonte
Sim. Como
man find
diz, "qualquer parte fracionária é ignorada". Se você dividir "1 dia, 23 horas, 59 minutos e 59 segundos" por "24 horas", poderá obter 1,9999, mas a parte .9999 será removida e, de repente, o arquivo terá apenas 1 dia.fonte
-mtime N
significa arquivos cuja idade A em dias satisfaz N ≤ A < N +1. Em outras palavras, seleciona arquivos que foram modificados pela última vez entre N e N +1 dias atrás.-mtime N
-mtime -N
significa arquivos cuja idade A satisfaz A < N , ou seja, arquivos modificados há menos de N dias atrás. Menos intuitivamente, significa arquivos cuja idade A satisfaz N +1 ≤ A , ou seja, arquivos modificados há pelo menos N +1 dias atrás.-mtime +N
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 2 dias atrás. Para modificar os arquivos há pelo menos 1 dia, use-mtime +0
.A descrição "foi modificada pela última vez * há 24 horas" é apenas uma aproximação e não muito clara.
Se você achar essas regras difíceis de lembrar, use um arquivo de referência.
(A sintaxe "1 dia atrás" requer GNU
touch
.)fonte
find
!Use -mmin, -amin, etc, para obter resultados exatos
fonte
-?min
argumentos funcionam exatamente como os-?time
argumentos, exceto com minutos em vez de dias. Eles também não são "exatos".Se você deseja exatamente arquivos com 48 horas de duração, e não 2 dias, adicione
--daystart
seufind
comando. Isso irá ajudá-lo.fonte
-daystart
(uma extensão GNU), não--daystart
. Então,-daystart
apenas significa comparar os horários com o início de hoje, e não com o horário atual, para--daystart -mtime +1
reportar arquivos que foram modificados mais de 48h / 2 horas antes do início de hoje, portanto, geralmente arquivos que foram modificados rapidamente antes de ontem .