Назад | Перейти на главную страницу

Почему «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.

Кроме того, я не понимаю, где хранится этот «часовой пояс» файла. В индекс похоже, не имеет дополнительных атрибутов для их хранения. Файловая система на сервере ext4.

Возможно, проблема с часовым поясом - отвлекающий маневр.

find . -mtime 7

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

find . -mtime +7

Я согласен с вами в том, что кажущийся часовой пояс является странным, но я думаю, что это объяснимо. man stat ясно, что time_t сохраняется, как говорит Шон Р. какой 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

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

Дата и время хранятся в файлах в секундах с полуночи 1 января 1970 года по всемирному координированному времени. Это означает, что с ними не связан часовой пояс. Затем программы используют настройку системного часового пояса в /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$

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

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

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

find -mtime -7 -daystart 

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