ログファイルなどでファイルが増え続ける場合、
最新ファイルは残し、古いファイルは随時削除したい場合があります。

以下のスクリプトは、指定されたディレクトリにあるファイルの中から、
引数に指定された新しいファイルの数分を残し、他のファイルを削除するスクリプトです。

■スクリプト本体
こちらよりダウンロードできます。

ファイル名:
delete_old.sh

使い方:
第一引数に、残す最新ファイルの数を指定し、
第二引数に、削除対象のファイルが含まれるディレクトリを指定してください。

例:
./delete_old.sh 3 /test/log
この場合、/test/logに含まれるファイルのうち、最新の3ファイルを残し、他を削除します。
ただし、ディレクトリは削除されません(エラーが出て削除さない)。

※注意※
誤ってファイルを削除しないよう、ダウンロードしたままでは、ファイルは削除されません。
削除対象のファイルは、「delete ~」のようなログで表示されます。
動作に問題が無いことを確認したうえで、11行目のコメント(#)を削除して、削除処理を有効にしてください。


■スクリプト処理解説
#!/bin/bash
所謂おまじない。どのシェルを使って処理をするかの指定をする。

FILE_LIST=`ls -t $2`
第二引数に指定されたディレクトリに含まれるファイルを、更新日時が新しい順で、変数FILE_LISTに代入する。

count=0
count変数に0を代入(変数初期化)。

for FILE in $FILE_LIST
FILE_LISTに含まれるファイル名を、順にFILE変数に代入する繰り返し。FILE変数に入れるファイルが無くなった時、この繰り返し処理を抜ける。

do
        ((count++))
count変数に1を加算(インクリメント)。

echo "check $FILE"
「check  FILE変数の内容」というログをコンソールに出力する。

if [ $count -gt $1 ]; then
if条件分岐。count変数が、第一引数に指定された数よりも大きい時、次のfiまでの間の処理を実行する

#rm $FILE
FILE変数のファイルを、削除する(削除処理を有効にする場合、#を削除してください)。
なお、rmに-rオプションを追加することで、ディレクトリも削除することができます。
ここでは、ディレクトリを誤って削除しないよう、あえてオプションを付けていません。

echo "delete $FILE"
「delete FILE変数の内容」というログをコンソールに出力する。

fi
if条件分岐の終了。

done
繰り返し処理の先頭に戻る。もう一度for~の処理を実行する。

echo "finish"
「finish」という文字列を出力する。

■補足
こういった処理は、自動で定期的に実行されるべきです。
削除処理をスクリプトで自動化したとはいえ、スクリプトを実行するのが手動では、手間がかかることに変わりはありません。
cronを設定することで、定期的に勝手に実行されることができるようになります。
是非cronの設定をして自動化をしましょう。
cronの設定方法は別の記事で解説したいと思います(記事にでき次第、ここにリンクを載せます)。

スポンサードリンク