findコマンドに mtimeというオプションがある。
+nや-nを設定でき、+の場合はファイル更新日がある時点から過去のファイルにマッチする。
-の場合は、ファイル更新日がある時点から未来に位置するファイルがマッチする。
nには数が入り、+3だったらおそらく3日前以前に最終更新されたファイル一覧が取得されるのだろうう。
-3だったらおそらく3日前以後に最終更新されたファイル一覧が取得されるのだろう。
漠然とこんな認識で居た。
しかし、この以前や以後の区切りが分からない。
というわけで最終更新日が5分おきにずれているファイル群を生成してみて
どこでマッチするのか試してみた。
ファイル名と更新日のタイムスタンプは同じになるように作っている。
マイナスの場合
[hogehoge@arcnote test]$ find . -mtime -3 | sort -r ./2017-04-03_01:50:37.txt ./2017-04-03_01:45:37.txt ./2017-04-03_01:40:37.txt ./2017-04-03_01:35:37.txt ./2017-04-03_01:30:37.txt ./2017-04-03_01:25:37.txt ./2017-04-03_01:20:37.txt ./2017-04-03_01:15:37.txt . [hogehoge@arcnote test]$ date 2017年 4月 6日 木曜日 01:12:02 JST [hogehoge@arcnote test]$
-3を指定すると、今日を0日として、3日前のちょうど同じ時刻から未来のファイルにマッチする。
-nを指定した場合は、このような方程式に当てはまると思われる。
(本日-n)日の同じ時刻 < 最終更新日
でもこの計算方法は誤りみたいだ。
答えはmanに書いてある。
findのmanを見ると、マイナスとは未満ということで
nは含まれない。
3未満にマッチということだが、どういうことなのだろうか?
nの数値は、現時刻からの時間差を24で割り、あまりを切り捨てることで導かれるようだ。
24時間前で1ということになる。
本日を4月6日とし、4月5日から4月6日までの間が0、4日から5日までの間が1ということになる。
日付の間が何日目になるのかを示した。
1日– 4 –2日– 3 –3日– 2 –4日– 1 –5日– 0 –6日
これを見ると、3日から4日の間が2ということになっている。
-mtime -3は3未満ということなので、
2,1,0にマッチする期間がそれに当たる。
故に3日から本日までのファイルがマッチされた
プラスの場合
[hogehoge@arcnote test]$ find . -mtime +3 | sort ./2017-04-02_00:45:37.txt ./2017-04-02_00:50:37.txt ./2017-04-02_00:55:37.txt ./2017-04-02_01:00:37.txt ./2017-04-02_01:05:37.txt ./2017-04-02_01:10:37.txt ./2017-04-02_01:15:37.txt [hogehoge@arcnote test]$ date 2017年 4月 6日 木曜日 01:18:37 JST [hogehoge@arcnote test]$
マイナスのときと同じ日が境目ではなかった。
マイナスのときとは24時間くらいの開きがある。
+3を指定するとこのような方程式に当てはまるファイルがマッチするようだ。
(3+1)日前の同じ時刻 > 最終更新日
これもマイナスとおなじように正しい解釈ではない
manに書いてあるところによると、
+nとはnを越える数値だそうだ。
マイナスのときと同じように考えてみよう。
1日– 4 –2日– 3 –3日– 2 –4日– 1 –5日– 0 –6日
3を越えるということなので、3ははいらない。
4以上の数値がマッチする。
つまり1日から2日の間が開始点であることがわかる。
そして確かに2日からマッチされている。
考え方まとめ
非常にわかりにくいが、
本日の現時点から、昨日の同時刻までの間を0日前
昨日の同時刻から一昨日の同時刻までを1日前とする。
-nの場合は、その何日前の日数がn未満である範囲がマッチする。
+nの場合は、その何日前の日数がnより上である範囲がマッチする。
だから、-nと+nの間に24時間の開きがあったわけだ。