Database JUNKY

MySQL,MariaDBを中心としたブログです

find exec rm を駆使して、最終アクセス日からN日以上経過しているファイルを削除する

長いインフラの運用の中で、毎年発生して、そして毎年のように同じ件を調べるという、時間の無駄遣いを軽減すべくここにメモを残しておいて、あとで、自分で見ます

内容的には、ファイルの更新日ではなくて、そのファイルの最終アクセスしてからN日経過したファイルを削除したいとかなんですね。なんだろ、業界的にいうと、LRU(Least Recently Used )っていうんですかね?

アクセスのない、古い動画はキャッシュから消してしまいましょうみたいな感覚で消す想定で、今回調べてみました。

find, atime , exec, rm がキーワードかな

Spinido® ノート PC スタンド silver (TI-Station)

Spinido® ノート PC スタンド silver (TI-Station)

f:id:hit10231023:20180308234003p:plain

以下のようなアクセス日時があったとする(ちなみにls -luは最終アクセス日時)

# ll -lu
total 24
-rw-r--r-- 1 root root 7 Jan  1 00:00 1.mp4
-rw-r--r-- 1 root root 7 Feb  1 00:00 2.mp4
-rw-r--r-- 1 root root 7 Mar  1 00:00 3.mp4
-rw-r--r-- 1 root root 7 Apr  1 00:00 4.mp4
-rw-r--r-- 1 root root 7 May  1 00:00 5.mp4
-rw-r--r-- 1 root root 7 Jun  1 00:00 6.mp4

最終アクセス日が、60日,90日,120日,150日以前のファイルを抽出

# find -atime +60
./2.mp4
./3.mp4
./4.mp4
./1.mp4
# find -atime +90
./2.mp4
./3.mp4
./1.mp4
# find -atime +120
./2.mp4
./1.mp4
# find -atime +150
./1.mp4

最終アクセス日が、60日,90日,120日,150日以降のファイルを抽出

# find ./ -atime -60
.
./5.mp4
./6.mp4
# find ./ -atime -90
.
./5.mp4
./4.mp4
./6.mp4
# find ./ -atime -120
.
./5.mp4
./3.mp4
./4.mp4
./6.mp4
# find ./ -atime -150
.
./2.mp4
./5.mp4
./3.mp4
./4.mp4
./6.mp4

findの結果を引数にして、コマンドを実行する

-exec [command] {} \;

をつけることによって実現できます

findで得た結果を、echoする

# find ./ -atime +120 -exec echo {} \;
./2.mp4
./1.mp4

findで得た結果を、rmする

# find ./ -atime +120 -exec rm -f  {} \;
# ls -la
total 16
-rw-r--r-- 1 root root 7 Jun 13 21:14 3.mp4
-rw-r--r-- 1 root root 7 Jun 13 21:14 4.mp4
-rw-r--r-- 1 root root 7 Jun 13 21:14 5.mp4
-rw-r--r-- 1 root root 7 Jun 13 21:14 6.mp4

応用

  • findでヒットしたファイルの合計容量を算出する

awkを併用すれば、こんな感じで合計が出せます

find ./ -type f -atime +41 -printf "%s\n"  | awk '{ sum += $1; } END { print sum/(1000000000); }'