find -mtime +1が2日前のファイルのみを返すのはなぜですか?

find -mtime +1が2日前のファイルのみを返すのはなぜですか?

心を空にしようとしています。なぜfindファイル変更時間を解釈する方法。特に-mtime +148時間を過ぎたファイルはなぜ表示されないのか理解できません。

サンプルテストで変更日が異なる3つのテストファイルを作成しました。

[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3

その後、スイッチを使って find を実行し、次の-mtime +1ような出力を得ました。

[root@foobox findtest]# find -mtime +1
./foo3

その後、findを実行して次の-mmin +1440ような結果を得ました。

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

findのマニュアルページによると、これが予想される動作であることがわかります。

 -mtime n
        File’s  data was last modified n*24 hours ago.  See the comments
        for -atime to understand how rounding affects the interpretation
        of file modification times.


-atime n
       File  was  last  accessed n*24 hours ago.  When find figures out
       how many 24-hour periods ago the file  was  last  accessed,  any
       fractional part is ignored, so to match -atime +1, a file has to
       have been accessed at least two days ago.

しかし、それはまだ私には理解できません。それでは、ファイルが1日23時間59分59秒を過ぎた場合、find -mtime +1その内容をすべて無視して1日0時間0分0秒になったものとして処理しますか?この場合、技術的には1日より古くないので無視されますか?

いいえ…いいえ…計算。

答え1

のパラメータは-mtime次のように解釈されます。一日中文書時代。-mtime +n方法厳密に言えば、次より大きい-mtime -n方法厳しく未満。

Bashを使用すると、より直感的な操作を実行できます。

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

24時間より古いファイルと24時間より新しいファイルをそれぞれ見つけます。

-mtime(時間または分単位で解析したい場合は、小数引数を入力するよりも簡単です。)

答え2

さて、私の考えに簡単な答えは、find実装がPOSIX / SuS標準に準拠しているため、このように動作する必要があるということです。から引用SUSv4/IEEE Std 1003.1、2013年版、「検索」:

-mtime nファイルの変更時間を86400で割った値(残り捨て)が
     初期化時間で
     nの場合、マスター用語はtrueと評価する必要があります。

(文書の他の部分では、n実際に何ができるの+nか、「より大きい」が何を意味するのかを説明します)。

標準でなぜこれを行うべきかについて言うと、ずっと前にプログラマーは怠惰に思ったり、それについて考えずにちょうどCコードを書いたようです(current_time - file_time) / 86400。 C 整数演算は残りを捨てます。スクリプトはこの動作に依存し、標準化されました。

正式な動作は、時間ではなく変更日のみを保存する仮想マシンにも移植可能です。そのようなシステムがあるかどうかはわかりません。

答え3

24時間小数点以下の期間は切り捨てられます!これは、「find -mtime +1」が2日以上前に変更されたファイルと一致することを意味します。

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

おそらく、次はGNUにのみ適用されますか?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago

答え4

したがって、ファイルが1日23時間59分59秒を超えた場合、find -mtime +1はすべてを無視し、1日0時間0分0秒になったかのように処理しますか?

はい。言ったように、man find「すべての素数部分は無視されます」。 「1日23時間59分59秒」を「24時間」で割ると1.9999が出ますが、0.9999部分が削除され、突然ファイルに1日だけ残ります。

関連情報