Delete the oldest files from a folder as long as it exceeds a certain size
Samples
Note that you have to launch using “source“
- Delete the oldest files in the current folder (
./) as long as it takes up more than 96MB:
source ./clean_custom.sh --path ./ -l 9600000 - Delete older files from temporary folder (
/tmp/) as long as it takes more than 2GB:
source ./clean_custom.sh --path /tmp/ -l 2000000000
Script source code
#!/usr/bin/env bash
PATH_TO_CLEAN=
NUMBER_FILES_TO_DELETE_EACH_LOOP=1
SIZE_LIMIT=2000000000
# ----------------------------------------------------------------------------
# usage:
usage()
{
echo "Clean directory: while size of a dir > limit, oldest files first."
echo "Usage: ${filename} [-p|--path path] [-s|--max-size size] | [-h]"
echo " -p|--path: path to clean"
echo " -l|--limit: max size for the folder (must be > 0)"
echo " -h|--help this help"
}
# ----------------------------------------------------------------------------
# handling arguments:
args=("$@")
filename=$(basename -- "$0" | sed 's/\(.*\)\..*/\1/')
while [ "$1" != "" ]; do
case $1 in
-p | --path ) shift
# stop if path doesn't exist:
if [ ! -d "$1" ]; then
echo "Path not found: '$1'"
usage
return 1
fi
PATH_TO_CLEAN=$1
;;
-l | --limit ) shift
SIZE_LIMIT=$(echo $1 | bc)
if [ $SIZE_LIMIT -le 0 ]
then
usage
return 1
fi
;;
-h | --help ) usage
return
;;
* ) usage
return 1
esac
shift
done
[ -z "$PATH_TO_CLEAN" ] && echo "Path empty" && usage && return 1
echo "Cleanin dir: '$PATH_TO_CLEAN', size limit=$SIZE_LIMIT"
# ----------------------------------------------------------------------------
# handling arguments:
while [ 1 ]
do
s=$(du -sb $PATH_TO_CLEAN | cut -f1 | bc)
if [ $s -gt $SIZE_LIMIT ]
then
find $PATH_TO_CLEAN -type f -printf '%T+ %p\n' | \
sort -nr | \
tail -$NUMBER_FILES_TO_DELETE_EACH_LOOP | \
cut -d' ' -f 2- | \
xargs -I {} rm -f {}
else
break
fi
done
return 0