web-dev-qa-db-ja.com

異なるタイムゾーンのファイルで「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コマンドを見つけました。そして、これらの2つはどういうわけか少し異なることを示しています

-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

日付はまあまあのようです。ビット1はタイムゾーンとして+0400を持ち、もう1つは+0300を持ちます。 find+0400を含むものを見つけられないのはなぜですか?

OSは CentOS 5.5 Finalと最新のアップデートで、lsバージョンは(GNU coreutils) 5.97です。

また、このファイルの「タイムゾーン」がどこに保存されているのかわかりません。 inode には、それらを格納するための追加の属性はありません。サーバー上のファイルシステムは ext4 です。

7

タイムゾーンの問題はレッドニシンである可能性があります。

find . -mtime 7

正確に7日前のファイルを検索する必要があります(「7」は7.000から7.999日のギブまたはテイクを意味し、「古い」は「最後の変更以降」を意味します)。最初のファイル(2010年6月)の日付から判断して、7日以上経過したファイルが必要な場合は、

find . -mtime +7

見かけ上のタイムゾーンが奇妙だという点についてはあなたにも同意しますが、それは説明できると思います。 man stat Sean Rが以下に述べるように、time_tが格納されていることは明らかです。 lsが行っているのは、それを現地時間として表示することであり、現地の夏時間の慣例を考慮に入れるのに十分親切です。

私のシステムは同じです。たまたま3月から10月に入るファイル時間は+0100タイムゾーンで表示されますが、10月から3月に入るファイル時間は+0000タイムゾーンで表示されます。これはファイルシステムに保存されているためではありませんが、タイムゾーンファイルは、6月にファイルに触れたときに、午前8時であると思ったときにそれを実行することをシステムに伝えていたため、冬ではなく午前7時でした。 lsは、たまたま夏の時間を表示するときに、夏のように表示するのに十分親切です。

lsの出力で、地域の慣習に従って夏でも冬でもないタイムゾーンを見つけることができる場合は、誤りです。ただし、私のシステムではタイムゾーンを見つけることができません。

17
MadHatter

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
3
user9517

タイムゾーンの部分についてもう少し詳しく説明します(「mtime」の議論は他のコメントで処理されます)...

日時は、UTC 1970年1月1日の午前0時からの秒数としてファイルに保存されます。それらに関連付けられたタイムゾーンがないことを意味します。次に、プログラムは/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分を示しています。違いは、TZ環境変数をGMTに設定した2番目の「ls」です。

"stat"を使用して、ファイルに関連付けられたすべての日時を調べることもできます。

2

上記に加えて、私はしばしば以下を使用します:

find -mtime -7 -daystart 

これは、findが今日の始めから最大(7 * 24)時間前のファイルを見つけることを示しています。

1
SmallClanger