"find -mtime" не работает должным образом для файлов с разными часовыми поясами?

У меня есть несколько файлов на сервере с датой несколько месяцев назад, но они невидимы для find -mtime 7 поиск.

Когда я перечисляю их как ls -l они выглядят совершенно нормально

-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

Верхний файл невидим для "find . -Mtime 1", а нижний - видимый.

Я чуть не ударился головой о стену, пытаясь понять, почему. Я попробовал несколько случайных вещей и наткнулся ls --full-time команда. И это показывает, что эти двое как-то немного отличаются

-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

Дата, кажется, в порядке, бит один +0400 в качестве часового пояса, а другой +0300, Как так find не может найти те, с +0400?

ОС CentOS 5.5 Final с последними обновлениями, ls версия (GNU coreutils) 5.97

Кроме того, дело в том, что я не понимаю, где хранится этот "часовой пояс" файла. У inode нет дополнительных атрибутов для их хранения. FS на сервере является ext4.

4 ответа

Возможно, проблема с тимзеоне - красная сельдь.

find . -mtime 7 

должен найти файлы, которые ровно семь дней назад ("семь", означающие от 7000 до 7,999 дней, "дай или забери" и "старое", означающее "с момента последнего изменения"). Если вы хотите, чтобы файлы были старше семи дней, что, судя по дате вашего первого файла (июнь 2010 года), попробуйте

find . -mtime +7

Я согласен с вами в том, что видимый часовой пояс странный, но я думаю, что это объяснимо. man stat Ясно, что time_t хранится, как говорит Шон R ниже. какая ls он показывает это как местное время, и он достаточно любезен, чтобы учесть местные соглашения о переходе на летнее время, когда это происходит.

Моя система такая же: времена файлов, которые выпадают в марте-октябре, отображаются с часовым поясом +0100, в то время как периоды падения в октябре-марте показываются с часовым поясом +0000, не потому, что они хранятся в файловой системе, а потому, что файл часового пояса сообщает моей системе, что в июне, когда я коснулся файла, я сделал бы это в то время, когда я думал, что было 8 утра, а не было бы 7 утра, если бы это было зимой. ls достаточно любезен при отображении времени, которое случается летом, чтобы показать их так, как они выглядели бы летом, вот и все.

Если в вашем выводе ls вы можете найти какие-либо часовые пояса, которые не соответствуют ни лету, ни зиме, в соответствии с вашим местным соглашением, то я ошибаюсь - но я не могу найти их в своей системе.

С find, -mtime работает в течение 24 часов, поэтому

-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

В дополнение к вышесказанному, я часто использую следующее:

find -mtime -7 -daystart 

Это говорит find, чтобы найти файлы, которые до (7 * 24) часов с начала сегодняшнего дня.

Чтобы объяснить его временную зону немного подробнее (обсуждение "mtime" выполняется другими комментариями)...

Дата и время сохраняются в файлах как секунды с полуночи 1 января 1970 года, UTC. Это означает, что с ними нет часового пояса. Затем программы используют настройку системного часового пояса в / etc / timezone, если она не переопределена переменной среды "TZ", для отображения этого времени в местном часовом поясе:

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$ 

Обратите внимание, что в последней строке он показывает 1:14 вечера, а в выводе над ним, где я использую часовой пояс США по умолчанию (GMT-0700), он показывает 6:14 утра. Разница во втором "ls" Я установил переменную окружения TZ на GMT.

Вы можете использовать "stat", чтобы проверить все время / даты, связанные с файлами, а также.

Другие вопросы по тегам