心を空にしようとしています。なぜfind
ファイル変更時間を解釈する方法。特に-mtime +1
48時間を過ぎたファイルはなぜ表示されないのか理解できません。
サンプルテストで変更日が異なる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日だけ残ります。