テックブログ

技術ネタ

特定日時が経過したファイルの検索【findコマンドオプション】

ttakaraです。

コマンドのオプションの詳細仕様を聞かれた際に、ふわふわした回答をしてしまったので、今回はその自戒を説明をとりまとめて紹介します。

Linuxサーバ上の古いバックアップデータやメールデータ削除

こういった定期的に必要になるデータ整理、できることならシェルスクリプト等で定期的に実行したいものです。

findコマンドの mtime オプションを使い、何日以内、何日前以前、という指定をするのがシンプルですが、このオプション、見えない小数点以下(0.999…)が含まれるため、扱いに注意が必要です。

findコマンドの mmin での期間指定を使いましょう、というだけなのですが、折角なので touch コマンドを使った動作テストで確認します。

findコマンド mtime / mmin オプションの動作テスト

findコマンドの mtime、mmin オプションの挙動を分かりやすくするために、ファイルを48個生成し、それらのタイムスタンプを強制的に変更します。

■テスト用ディレクトリ作成、移動

 [~]$ mkdir testdir
 [~]$ cd testdir/

■テスト用ディレクトリに連番ファイル作成

 [~/testdir]$ touch test{01..48}
 [~/testdir]$ ls
 test01 test05 test09 test13 test17 test21 test25 test29 test33 test37 test41 test45
 test02 test06 test10 test14 test18 test22 test26 test30 test34 test38 test42 test46
 test03 test07 test11 test15 test19 test23 test27 test31 test35 test39 test43 test47
 test04 test08 test12 test16 test20 test24 test28 test32 test36 test40 test44 test48

■連番ファイルのタイムスタンプを修正

TestFilesという変数に配列として格納して、ループで処理します。

 [~/testdir]$ TestFiles=(ls -1)
 [~/testdir]$ echo ${TestFiles[@]}
 test01 test02 test03 test04 test05 test06 test07 test08 test09 test10 test11 test12 test13 test14 test15 test16 test17
 test18 test19 test20 test21 test22 test23 test24 test25 test26 test27 test28 test29 test30 test31 test32 test33 test34
 test35 test36 test37 test38 test39 test40 test41 test42 test43 test44 test45 test46 test47 test48

48個のファイル名を変数にまとめて格納したので、これでファイル名を指定して、タイムスタンプを1時間ずつズラして調整します。

 [~/testdir]$ for Num in seq 0 47
 > do
 > touch –date=”date -d "$Num hour ago" "+%Y-%m-%d %H%M"” ${TestFiles[$Num]}
 > done

 [~/testdir]$ ls -l
 total 0
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 22:53 test01
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 21:53 test02
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 20:53 test03
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 19:53 test04
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 18:53 test05
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 17:53 test06
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 16:53 test07
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 15:53 test08
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 14:53 test09
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 13:53 test10
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 12:53 test11
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 11:53 test12
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 10:53 test13
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 09:53 test14
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 08:53 test15
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 07:53 test16
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 06:53 test17
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 05:53 test18
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 04:53 test19
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 03:53 test20
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 02:53 test21
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 01:53 test22
 -rw-rw-r– 1 ttakara ttakara 0 Dec 12 00:53 test23
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 23:53 test24
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 22:53 test25
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 21:53 test26
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 20:53 test27
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 19:53 test28
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 18:53 test29
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 17:53 test30
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 16:53 test31
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 15:53 test32
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 14:53 test33
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 13:53 test34
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 12:53 test35
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 11:53 test36
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 10:53 test37
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 09:53 test38
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 08:53 test39
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 07:53 test40
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 06:53 test41
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 05:53 test42
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 04:53 test43
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 03:53 test44
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 02:53 test45
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 01:53 test46
 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 00:53 test47
 -rw-rw-r– 1 ttakara ttakara 0 Dec 10 23:53 test48

処理内で1時間前に変更される test02 ファイルを確認すると、Access と Modify のタイムスタンプが1時間前になっています。

 [~/testdir]$ stat test02
 File: ‘test02’
 Size: 0 Blocks: 0 IO Block: 4096 regular empty file
 Device: fd00h/64768d Inode: 9072590 Links: 1
 Access: (0664/-rw-rw-r–) Uid: ( 1697/ ttakara) Gid: ( 1697/ ttakara)
 Access: 2021-12-12 21:53:00.000000000 +0900
 Modify: 2021-12-12 21:53:00.000000000 +0900
 Change: 2021-12-12 22:53:01.829464688 +0900
 Birth: –

findコマンド mtime / mmin オプションの動作テストの準備が完了したので、実際に挙動を確認していきます。

■mtimeオプションの場合

Modify Time を 指定した期間(日)で抽出するためのオプションです。

本来、”mtime +1″ で、1日よりも前に編集されたファイルが抽出されますが、日付指定(小数点無視)の仕様により、1.9999…日 よりも前、となり、ほぼ2日以上前と同義となり、全てのファイルの抽出に失敗します。

 [~/testdir]$ find ./ -mtime +1 -ls
 [~/testdir]$

“-mtime +0” を指定すると、 0.999…日 よりも前、との指定になり、
概ね 1日以上前 のデータが検索できます。

 [~/testdir]$ find ./ -mtime +0 -ls
 9822799 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 22:53 ./test25
 9822804 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 21:53 ./test26
 9822811 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 20:53 ./test27
 9822812 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 19:53 ./test28
 9822813 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 18:53 ./test29
 9822816 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 17:53 ./test30
 9907045 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 16:53 ./test31
 9907387 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 15:53 ./test32
 9907457 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 14:53 ./test33
 9907458 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 13:53 ./test34
 9907459 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 12:53 ./test35
 9907460 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 11:53 ./test36
 9907461 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 10:53 ./test37
 9907463 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 09:53 ./test38
 9907465 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 08:53 ./test39
 9907467 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 07:53 ./test40
 9907470 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 06:53 ./test41
 9907472 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 05:53 ./test42
 9907473 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 04:53 ./test43
 9907475 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 03:53 ./test44
 10094880 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 02:53 ./test45
 10096473 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 01:53 ./test46
 10177460 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 00:53 ./test47
 10177488 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 10 23:53 ./test48

mtime / actime の小数点の扱いを把握していれば、指定したい日数から1を引いた数を指定して上手く使えるでしょうが、分かる人だけ分かれば良い、みたいな操作になりがちです。

■mminオプションの場合

Modify Time を 指定した期間(分)で抽出するためのオプションです。1日(1440分)以上前のデータを抽出します。

 [~/testdir]$ find ./ -mmin +1440 -ls
 9822799 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 22:53 ./test25
 9822804 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 21:53 ./test26
 9822811 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 20:53 ./test27
 9822812 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 19:53 ./test28
 9822813 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 18:53 ./test29
 9822816 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 17:53 ./test30
 9907045 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 16:53 ./test31
 9907387 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 15:53 ./test32
 9907457 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 14:53 ./test33
 9907458 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 13:53 ./test34
 9907459 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 12:53 ./test35
 9907460 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 11:53 ./test36
 9907461 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 10:53 ./test37
 9907463 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 09:53 ./test38
 9907465 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 08:53 ./test39
 9907467 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 07:53 ./test40
 9907470 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 06:53 ./test41
 9907472 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 05:53 ./test42
 9907473 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 04:53 ./test43
 9907475 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 03:53 ./test44
 10094880 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 02:53 ./test45
 10096473 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 01:53 ./test46
 10177460 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 11 00:53 ./test47
 10177488 0 -rw-rw-r– 1 ttakara ttakara 0 Dec 10 23:53 ./test48

“-mtime +0” と同じく、1日以上前のデータが抽出できます。

また、-mmin オプションなら、少数点が含まれたとしても、ほぼ1日近いズレになる mtime と異なり、1分未満のズレに収まるハズです。

今回の自戒のまとめ

ファイルのタイムスタンプが何日以上前、何日以内だったら、という条件で抽出、操作する場合は mmin / cmin での時間指定をすれば、誤差も小さく、分かりやすい処理にまとめられます。

“1440(分) * 希望日数” 等の計算と合わせて、定期処理をうまく回していきましょう。

ではまた。

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください