Skip to content

Instantly share code, notes, and snippets.

@imperialwicket
Last active June 24, 2022 20:40
Show Gist options
  • Save imperialwicket/2727200 to your computer and use it in GitHub Desktop.
Save imperialwicket/2727200 to your computer and use it in GitHub Desktop.
Cleaner.sh - Bash script for cleaning directory contents
#!/bin/bash
#######################
# cleaner.sh
# by imperialWicket
#
# version 1.0.1
#######################
# cleaner usage function
usage()
{
cat << EOF
cleaner.sh
This script cleans directories. It is useful for backup
and log file directories, when you want to delete older files.
USAGE: cleaner.sh [options]
OPTIONS:
-h Show this message
-q This script defaults to verbose, use -q to turn off messages
(Useful when using the cleaner.sh in automated scripts).
-s A search string to limit file deletion, defaults to '*' (All files).
-m The minimum number of files required in the directory (Files
to be maintained), defaults to 5.
-d The directory to clean, defaults to the current directory.
EXAMPLES:
In the current directory, delete everything but the 5 most recently touched
files:
cleaner.sh
Same as:
cleaner.sh -s * -m 5 -d .
In the /home/myUser directory, delete all files including text "test", except
the most recent:
cleaner.sh -s test -m 1 -d /home/myUser
Don't ask for any confirmation:
cleaner.sh -s test -m 1 -d /home/myUser -q
EOF
}
# Set default values for VARS
SEARCH_STRING='*'
MIN_FILES='5'
DIR='.'
QUIET=0
DELETED=0
# cleaner delete files function
delete()
{
FILES=`ls -1p "$SEARCH_STRING"* 2>/dev/null | grep -vc "/$"`
while [ $FILES -gt $MIN_FILES ]
do
ls -tr "$SEARCH_STRING"* 2>/dev/null | head -1 | xargs -i rm {}
FILES=`ls -1p "$SEARCH_STRING"* 2>/dev/null | grep -vc "/$"`
let "DELETED+=1"
done
}
# cleaner set args and handle help/unknown arguments with usage() function
while getopts ":s:m:d:qh" flag
do
#echo "$flag" $OPTIND $OPTARG
case "$flag" in
h)
usage
exit 0
;;
q)
QUIET=1
;;
s)
SEARCH_STRING=$OPTARG
;;
m)
MIN_FILES=$OPTARG
;;
d)
DIR=$OPTARG
;;
?)
usage
exit 1
esac
done
# cleaner change to requested directory and perform delete with or without verbosity
cd $DIR
CONFIRM_FILES=`ls -1p "$SEARCH_STRING"*`
if [ $QUIET = 0 ]
then
if [ $MIN_FILES = 0 ]
then
echo 'Delete the following files (y/n)?'
else
echo Delete the following files except the $MIN_FILES 'most recently touched (y/n)?'
fi
echo $CONFIRM_FILES
read CONFIRM
if [ $CONFIRM = y ] || [ $CONFIRM = Y ] || [ $CONFIRM = YES ] || [ $CONFIRM = yes ] || [ $CONFIRM = Yes ]
then
delete
if [ $DELETED = 1 ]
then
TEXT='file.'
else
TEXT='files.'
fi
echo Removed $DELETED $TEXT
else
echo Cleaner canceled.
fi
else
delete
fi
# cleaner change back to the original directory
cd $OLDPWD
exit 0
@NicolasDEVOUGE
Copy link

Hello, I have a problem when I start the script : it prints : ls: cannot access **: No such file or directory
I don't understand why, I have tried to run the code of delete{} directly i bash, and it works :/

@ZANYARMANDO
Copy link

well done

@necrose99
Copy link

nice can clear rej files and or other trash files...

@ThorstenWirth
Copy link

Hello, i also have the problem when I start the script

ls: cannot access '**': No such file or directory

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment