“find -mtime” não funciona como esperado em arquivos com fusos horários diferentes?

7

Eu tenho alguns arquivos no servidor com a data há vários meses, mas invisíveis para find -mtime 7 search.

Quando eu os listar como ls -l , eles parecem perfeitamente normais

-rw-r--r-- 1 root root    347253 Jun 12 16:26 pedia_main.2010-06-12-04-25-02.sql.gz
-rw-r--r-- 1 root root 490144578 Nov 24 16:26 gsmforum_main.2010-11-24-04-25-02.sql.gz

O arquivo principal é invisível para "find. -mtime 1", mas o botão inferior - é visível.

Eu quase bati com a cabeça na parede tentando entender por quê. Eu tentei algumas coisas aleatórias e me deparei com o comando ls --full-time . E isso mostra que esses dois são um pouco diferentes

-rw-r--r-- 1 root root    347253 2010-06-12 16:26:20.000000000 +0400 pedia_main.2010-06-12-04-25-02.sql.gz
-rw-r--r-- 1 root root 490144578 2010-11-24 16:26:12.000000000 +0300 gsmforum_main.2010-11-24-04-25-02.sql.gz

A data parece estar ok, o bit um tem +0400 como fuso horário e o outro é +0300 . Como é que find não consegue encontrar os com +0400 ?

O SO é o CentOS 5.5 Final com as atualizações mais recentes, ls versão é (GNU coreutils) 5.97

Além disso, o problema é que não entendo onde esse "fuso horário" do arquivo está armazenado. O inode não possui atributos extras para armazená-los. O FS no servidor é ext4.

    
por Vladislav Rastrusny 01.12.2010 / 12:15

4 respostas

14

É possível que a questão do timzeone seja um problema.

find . -mtime 7 

deve encontrar arquivos com exatamente sete dias ("sete" significando entre 7.000 e 7.999 dias, mais ou menos, e "antigo" significando "desde a última modificação"). Se você quiser arquivos com mais de sete dias, que, a julgar pela data em seu primeiro arquivo (junho de 2010), tente

find . -mtime +7

Concordo com você sobre o fuso horário aparente ser estranho, mas acho que é explicável. man stat está claro que um time_t é armazenado, como diz Sean R abaixo. O que ls está fazendo é exibir isso como uma hora local, e está sendo gentil o suficiente para levar em conta as convenções locais de horário de verão quando isso acontece.

Meu sistema é o mesmo: os horários dos arquivos que caem em março-outubro são mostrados com um fuso horário de +0100, enquanto aqueles que caem em out-março são mostrados com um fuso horário de + 0000, não porque estejam armazenados no arquivo mas porque o arquivo fuso horário diz ao meu sistema que, em junho, quando eu toquei no arquivo, eu teria feito isso em um horário que eu pensava que era 8 da manhã, não seria 7 da manhã se fosse o inverno. ls é gentil o suficiente, ao exibir os horários que acontecem no verão, para mostrá-los como eles teriam aparecido no verão, isso é tudo.

Se você puder encontrar fusos horários na sua saída ls que não sejam verão ou inverno de acordo com sua convenção local, então eu estou errado - mas não consigo encontrar nenhum no meu sistema.

    
por 01.12.2010 / 13:06
3

Com find, -mtime funciona em períodos de 24 horas, então

-mtime 0 or -mtime -1 mean today
-mtime 3 would mean 3 days old
-mtime +1 means greater than one day old 
-mtime -7 means less than 7 days old
    
por 01.12.2010 / 13:10
2

Para explicar um pouco mais a parte do fuso horário (a discussão "mtime" é tratada por outros comentários) ...

A data e os horários são armazenados em arquivos como segundos desde a meia-noite de 1º de janeiro de 1970, UTC. Significa que não há fuso horário associado a eles. Em seguida, os programas usam a configuração de fuso horário do sistema em / etc / timezone, a menos que sejam substituídos pela variável de ambiente "TZ", para exibir essa hora no fuso horário local:

chats:/tmp$ touch foo
chats:/tmp$ ls -l foo
-rw-r--r-- 1 jafo jafo 0 Dec  1 06:14 foo
chats:/tmp$ TZ=GMT ls -l foo          
-rw-r--r-- 1 jafo jafo 0 Dec  1 13:14 foo
chats:/tmp$ 

Observe na última linha que está mostrando 1:14 pm, e na saída acima, onde estou usando o fuso horário padrão do horário de Mountain nos EUA (GMT-0700), ele está mostrando 6:14 da manhã. A diferença é o segundo "ls" eu configurei a variável de ambiente TZ para GMT.

Você pode querer usar "stat" para examinar todas as horas / datas associadas aos arquivos também.

    
por 01.12.2010 / 14:17
1

Além do acima, geralmente uso o seguinte:

find -mtime -7 -daystart 

Isso informa a localização para localizar arquivos com até (7 * 24) horas de uso desde o início de hoje.

    
por 01.12.2010 / 13:49