I have a daily backups named like this:
yyyymmddhhmm.zip // pattern
201503200100.zip // backup from 20. 3. 2015 1:00
I'm trying to create a script that deletes all backups older than 3 days. The script should be also able to delete all other files in the folder not matching the pattern (but there would be a switch for that in the script to disable this).
To determine the file age I don't want to use backups timestamps as other programs also manipulate with the files and it can be tampered.
With the help of: Remove files older than 5 days in UNIX (date in file name, not timestamp)
I got:
#!/bin/bash
DELETE_OTHERS=yes
BACKUPS_PATH=/mnt/\!ARCHIVE/\!backups/
THRESHOLD=$(date -d "3 days ago" +%Y%m%d%H%M)
ls -1 ${BACKUPS_PATH}????????????.zip |
while read A DATE B FILE
do
[[ $DATE -le $THRESHOLD ]] && rm -v $BACKUPS_PATH$FILE
done
if [ $DELETE_OTHERS == "yes" ]; then
rm ${BACKUPS_PATH}*.* // but I don't know how to not-delete the files matching pattern
fi
But it keeps saying:
rm: missing operand
Where is the problem and how to complete the script?
Best Answer
The first problem in your code is that you are parsing
ls
. This means it will break very easily, if you have any spaces in your file or directory names for example. You should use shell globbing orfind
instead.A bigger problem is that you are not reading the data correctly. Your code:
will never populate
$FILE
. The output ofls -1
is just a list of filenames so, unless those file names contain whitespace, only the first of the 4 variables you give toread
will be populated.Here's a working version of your script: