Estou lutando para entender por que o find interpreta o arquivo horas de modificação da maneira que ele faz. Especificamente, eu não entendo por que -mtime +1 não mostra arquivos com menos de 48 horas.

Como um exemplo de teste Criei três arquivos de teste com datas de modificação diferentes:

[[email protected] 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 find com a opção -mtime +1 e consegui a seguinte saída:

[[email protected] findtest]# find -mtime +1 ./foo3 

Em seguida, executei find com -mmin +1440 e obtive a seguinte saída:

[[email protected] findtest]# find -mmin +1440 ./foo3 ./foo2 

De acordo com a página de manual do find, entendo que este é o 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 tem 1 dia, 23 horas, 59 minutos e 59 segundos, find -mtime +1 ignora tudo isso e apenas o trata como se fosse 1 dia, 0 horas, 0 minutos e 0 segundos? Nesse caso, não é tecnicamente mais antigo que 1 dia e é ignorado?

Não … não … computa.

Comentários

  • No começo também pareceu engraçado para mim, mas quando você considera que mede a idade dos arquivos em dias inteiros, então ele faz exatamente o que você ‘ esperava. Ganhou ‘ t fornecer arquivos com 1 dia de idade. Um arquivo int (1,99) dias não é > 1.
  • Pense em como os humanos tratam a idade coloquialmente. Se alguém tem 79,9 anos, você diz que tem 79 anos. Então, se você está procurando por um humano com mais de 79 anos, você está procurando por um humano que tenha > 79,99999 anos, ou seja, > = 80 anos. As pessoas olham para a idade como números inteiros e arredondam para baixo e veem cada idade como um intervalo.

Resposta

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

-mtime n
O primário deve avaliar como verdadeiro se o tempo de modificação do arquivo subtraído
do tempo de inicialização, dividido por 86400 (com qualquer resto descartado), é n.

(Em outra parte desse documento, ele explica que n pode realmente ser +n, e o significado disso como “maior que”).

Quanto ao motivo pelo qual o padrão diz que deve se comportar dessa maneira – bem, eu acho que há muito tempo um programador era preguiçoso ou não pensava nisso, e apenas escreveu o C código (current_time - file_time) / 86400. A aritmética de inteiros C descarta o restante. Os scripts começaram dependendo desse comportamento e, portanto, foi padronizado.

O comportamento específico também seria portável para um sistema hipotético que armazenou apenas uma data de modificação (não a hora). Não sei se esse sistema já existia.

Comentários

  • find foi claramente projetado para fazer apenas trabalhos de limpeza.

Resposta

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:

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

para encontrar arquivos com mais de 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.)

Comentários

  • Para listar esses arquivos (apenas regulares) com tamanhos legíveis e em chr ordem onológica, faça $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • Isso também terá o mesmo efeito porque os dois comandos juntos ainda perderão os arquivos dentro da janela de um minuto 24 horas atrás .
  • $(()) é uma sintaxe aritmética de shell simples, ‘ não é específica do Bash, cf. pubs.opengroup.org/onlinepubs/009695399/utilities/…
  • @JosipRodin Não , não necessariamente verdade! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Como o Bash é um ” extendido ” SH, ele suporta esta sintaxe, mas alguns outros shells não ‘ t, por exemplo csh / tcsh.
  • @ t0r0X meu ponto é que ‘ não é um bashismo, em vez disso, funciona no traço e no zsh e tudo o mais serve como um padrão /bin/sh.

Resposta

Períodos fracionais de 24 horas são truncados! Isso significa que “find -mtime +1” diz para corresponder aos 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 só pode funcionar 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 

Comentários

  • Obrigado, estava tentando descobrir por que -mtime X era diferente de -mtime + X
  • Imagino que + X significa shorts para (X + 1, X + 2, X + 3, …). 🙂
  • links para todos os documentos de origem confundem a resposta simples. Os exemplos são importantes. sua boa documentação. Vamos fazer mais deles! Gosto desta resposta

Resposta

-mtime N significa arquivos cujo 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 , ou seja, arquivos modificados há menos de N dias. De maneira menos intuitiva, -mtime +N significa arquivos cuja idade A satisfaz N +1 ≤ A , ou seja, arquivos modificado 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 2 dias. Para obter arquivos modificados pelo menos 1 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 um muito claro.

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 GNU touch.)

Comentários

  • Bela explicação, os três primeiros parágrafos deve ser adicionado à documentação de find!

Resposta

Então, se um arquivo tem 1 dia, 23 horas, 59 minutos e 59 segundos, find -mtime +1 ignora tudo isso e trata-o como se fosse 1 dia , 0 horas, 0 minutos e 0 segundos?

Sim. Como man find diz, “qualquer a parte fracionária é ignorada “. Se você dividir” 1 dia, 23 horas, 59 minutos e 59 segundos “por” 24 horas “, pode obter 1.9999, mas t A parte .9999 é então removida e de repente o arquivo tem apenas 1 dia.

Resposta

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

Comentários

  • Os argumentos -?min funcionam exatamente como o -?time argumentos exceto com minutos em vez de dias. Eles também não são ‘ t “exatos”.

Resposta

Se você deseja arquivos com exatamente 48 horas, não com 2 dias, deve adicionar --daystart ao comando find. Isso irá ajudá-lo.

find . type -f -daystart -mtime +1 

Comentários

  • Não, primeiro ‘ s -daystart (uma extensão GNU), não --daystart. Então, -daystart significa apenas comparar as horas com o início de hoje em vez da hora atual, para que --daystart -mtime +1 relataria os arquivos que foram mais modificados que 48h / 2 horas antes do início do dia de hoje, então geralmente arquivos que foram modificados abruptamente antes de anteontem.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *