find exec rm を駆使して、最終アクセス日からN日以上経過しているファイルを削除する
長いインフラの運用の中で、毎年発生して、そして毎年のように同じ件を調べるという、時間の無駄遣いを軽減すべくここにメモを残しておいて、あとで、自分で見ます
内容的には、ファイルの更新日ではなくて、そのファイルの最終アクセスしてからN日経過したファイルを削除したいとかなんですね。なんだろ、業界的にいうと、LRU(Least Recently Used )っていうんですかね?
アクセスのない、古い動画はキャッシュから消してしまいましょうみたいな感覚で消す想定で、今回調べてみました。
find, atime , exec, rm がキーワードかな
APPLE MacBook (1.1GHzデュアルコア Intel CoreMプロセッサ/12型/8GB/256GB/USB-C/ゴールド) MK4M2J/A
- 出版社/メーカー: アップル
- 発売日: 2015/04/11
- メディア: Personal Computers
- この商品を含むブログ (2件) を見る
Spinido® ノート PC スタンド silver (TI-Station)
- 出版社/メーカー: Spinido
- メディア: エレクトロニクス
- この商品を含むブログを見る
Inateck 12インチ インナーケース Apple New MacBook 12/ウルトラブック/ネットブック用 プロテクターケース [カラー: グレー]
- 出版社/メーカー: Inateck
- メディア: エレクトロニクス
- この商品を含むブログを見る
12インチMacBook用 専用シェルカバー LENTION ハードケース 丈夫なゴム足 柔軟性高い(マット・半透明・ブラック)
- 出版社/メーカー: LENTION
- メディア: エレクトロニクス
- この商品を含むブログを見る
- 出版社/メーカー: LENTION
- メディア: エレクトロニクス
- この商品を含むブログを見る
以下のようなアクセス日時があったとする(ちなみに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); }'