"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", чтобы проверить все время / даты, связанные с файлами, а также.