数を超えたときにディレクトリ内のすべてのファイルを削除する cron ジョブを実行したいと考えています。
たとえば1000ファイルになったら、そのディレクトリ内のすべてのファイルを削除します。
目標は、キャッシュ ディレクトリをクリアすることです。
#!/bin/bash
CACHE_DIR=/home/cache
if [[ `ls -al $CACHE_DIR | wc -l` -ge 1000 ]] ; then
find $CACHE_DIR -t file -exec rm -f {} \;
fi;
ファイル数が 1000 以上の場合は、/home/cache 内の通常のファイルをすべて削除します。
すべてのファイルを削除する代わりに、一般的な LRU (Least Recent Used) キャッシュは、最近使用されていない古いエントリを削除し、最近使用されたエントリを保持します。
ls -ut1 | tail -n+1001 | xargs -n 50 rm
これにより、ディレクトリ内のすべてのファイルがアクセス時間順に並べ替えられ、最近アクセスされたファイルが一番下になります。Tail は上位 1000 個を省略し、残りを「xargs rm」に送信して em を削除します。ファイル名が長く、1 つのコマンドの長さが ARG_MAX を超える場合は、xargs の「-n 50」オプションが必要になることがあります。
ファイル数が 1000 未満の場合、「xargs rm」でエラーが発生します。それを片付けるために。
ls -ut1 | tail -n+1001 > /tmp/files$$
if [[ `cat /tmp/files$$ | wc -l` -ge 1001 ]] ; then
while read line ; do
rm "$line"
done < /tmp/files$$
fi
rm /tmp/file$$