У меня есть файлы на сервере с датой несколько месяцев назад, но они не видны 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) часов с начала сегодняшнего дня.