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