Log files are a brilliant feature of any piece of software / operating system. However, over time they can take up space and become a pain to remove. In this blog post I am going to look at a quick bash script that can be used via cron to delete older log files.
The Set Up
In this scenario I have a folder (/home/pi/test/) where one of my programs writes regular log files to. When the log file reaches a certain size (e.g. 100MB) it generates a new log file (sequentially numbered). The scenario could also be that the log file is generated daily.

For this scenario I created the .log files using the Linux touch command:
touch {1..99}.log

As I want to delete files that are old (i.e. not created today) I had a few options.
- Wait several days to test my bash script.
- Change the systems date/time to the future.
- Use touch to modify the files.
I took the option of using the touch command to change the files named 1.log through 55.log.
touch -a -m -t 202004011220.01 {1..55}.log
This command tells touch to:
-a is the access time
-m is the modification time
-t tells touch that I want to provide a specific date/time which is in the format:
YYYYMMDDHHMM.SS
Note: YYYY in this case is DECADE-INDIVIDUAL_YEAR-CENTURY-CENTURY, so 1982 would be 8219.
With that in mind 202004011220.01 becomes 1st April 2020 at 12:20 (and 1 second).
- touch -a -m -t 202004011220.01 {1..55}.log
Why Have A Set Up?
This bash script deletes files. In theory it could delete a lot of files, and if run with sudo or root it could delete system files. With this in mind I wanted to test the script, run it multiple times and tweak it, so I needed a test set up.
Warning: I recommend testing (and retesting) scripts like this before using them on a live system. Messing up a wildcard, folder path or file name pattern can have major consequences.
The Bash Script

The bash script that finds and deletes the files is only a few lines long and I’ve added in a basic logging function so that I know when it ran and what it deleted.
#!/usr/bin/env bash # geektechstuff # script to remove old files folder_path=/home/pi/test/ log_of_files=/home/pi/files_deleted.log date >> $log_of_files echo "---" >> $log_of_files find $folder_path -mtime +31 -name "*.log" >> $log_of_files find $folder_path -mtime +31 -name "*.log" -delete echo "--- " >> $log_of_files
Breaking the bash script down:
#!/usr/bin/env bash
A she-bang line to tell the operating system what to use to run the script
folder_path=/home/pi/test/
The folder path where the log files are. I thought best to hard code this here so that it is not accidentally mistyped at run time.
log_of_files=/home/pi/files_deleted.log
The location of where I want my script to log what it has done.
date >> $log_of_files echo "---" >> $log_of_files
Outputting the systems current date/time and then a line of hyphens into the log file.
find $folder_path -mtime +31 -name "*.log" >> $log_of_files
Outputs the files that the find command finds to the log file. These will be the files that bash script will delete.
-mtime is the files modification time. In this case I’m asking for anything greater than 31 days.
-name is the files name. In this case I am asking for any file names that end .log
find $folder_path -mtime +31 -name "*.log" -delete
This line is very similar to the above, but instead of outputting the list of files to the log file it deletes them (-delete).
echo "--- " >> $log_of_files
Adds another line of hyphens to the log file.
Modifying Run Permissions And Scheduling
Once created and tested, the file can be made executable and set to run at certain times on certain dates:
You must be logged in to post a comment.