During a project, we casually gathered waaaay too many archive files.  These were intentionally stored, however, in development and testing environments, they became a nuisance, and took up too much space. Occasionally the Ops team would send out an email saying that disk space was full, and it was time to do some cleanup.

I created a fairly simple script (see below) that searches some directories for specific files/file types, and lists them out, or optionally deletes them.  After creating the script for my specific requirement, I went back and added options for more re-usability.  In our scenario, we were storing some temp files under a ‘/mnt/edi/tmp’ directory, and archives under a ‘staging‘ directory.

Using the ‘find’ command under Linux, we were able to locate files that exceeded a certain age, and then delete them.

 

**You will need to modify the script to point to your specific directories!

 

Here are some common usages:

Help

Take a look at the command options.

:~/scripts$ ./cleanup.sh -h
************************************
Cleanup command line options:
-d : actually delete the files.
-l : list the files for deletion.
-p : does not prompt for deletion.
-f : forces the deletion.
-t n : where n is number of days old. Defaults to 7
-h : displays these instructions.
************************************

List

List out the files that would be deleted.

 :~/scripts$ ./cleanup.sh -l
Thu Aug 3 09:27:17 MDT 2017 Looking for files older than 7 days.
checking /mnt/edi/tmp directory. 4 files found for destruction
checking /mnt/edi/Eligibility/*/staging directories. 0 files found for destruction

Files to delete...
/mnt/edi/tmp/FS0A9B8D1115D7F4987590000038F07287.payload
/mnt/edi/tmp/FS0A9B8D1115D7B03AB080000038F06582.payload
/mnt/edi/tmp/FS0A9B8D1115D7F4988260000038F07296.payload
/mnt/edi/tmp/FS0A9B8D1115D7F4988150000038F07293.payload

Delete

Actually, delete the files (add the -p command to not prompt).

:~/scripts$ ./cleanup.sh -dp
Thu Aug 3 09:29:00 MDT 2017 Looking for files older than 7 days.
checking /mnt/edi/tmp directory. 10 files found for destruction
checking /mnt/edi/Eligibility/*/staging directories. 0 files found for destruction

*******************************
Deleting files.
*******************************

 

Cleanup.sh bash script

Please, please test this thoroughly before applying it to your environment!

#!/bin/bash
prompt="-i"
mtime="7"
while getopts "dlhpft:" opt;
do
case $opt in
d) doDelete="true"
;;
l) listfiles="true"
;;
h) listhelp="true"
;;
p) prompt=""
;;
f) force="-f"
;;
t) mtime="$OPTARG"
;;
esac
done

 

if [ "$listhelp" == "true" ];
then
echo "************************************"
echo "Cleanup command line options:"
echo " -d : actually delete the files."
echo " -l : list the files for deletion."
echo " -p : does not prompt for deletion."
echo " -f : forces the deletion."
echo " -t n : where n is number of days old. Defaults to 7"
echo " -h : displays these instructions."
echo "************************************"

 

exit
fi

 

echo "$(date) Looking for files older than" $mtime "days."
echo "checking /mnt/edi/tmp directory. " `find /mnt/edi/tmp -name *.payload -mtime +$mtime | wc -l` " files found for destruction"
echo "checking /mnt/edi/Eligibility/*/staging directories. " `find /mnt/edi/Eligibility/*/staging -name "*.*" -mtime +$mtime | wc -l` " files found for destruction"

 

if [ "$listfiles" == "true" ];
then
echo ""
echo "Files to delete..."
find /mnt/edi/tmp -name *.payload -mtime +$mtime
find /mnt/edi/Eligibility/*/staging -name "*.*" -mtime +$mtime
fi

 

if [ "$doDelete" == "true" ];
then
echo ""
echo "*******************************"
echo " Deleting files."
echo "*******************************"
find /mnt/edi/tmp -name *.payload -mtime +$mtime -exec rm $prompt $force {} ;
find /mnt/edi/Eligibility/*/staging -name "*.*" -mtime +$mtime -exec rm $prompt $force {} ;
fi

 

Bonus Option: Automatically Schedule this using Cron!

Execute ‘crontab -e‘ and add an entry to run this automatically.  This sample entry runs the script every day at noon, deleting, non-prompting, and listing out the files while logging all actions to a cleanup.log file!

0 12 * * * /home/oracle/scripts/cleanup.sh -dpl >> /home/oracle/scripts/cleanup.log 2>&1

 

Also, check out how to Automatically Rotate Managed Server Log Files!