I am new to shell scripting, so I need some help here. I have a directory that fills up with backups. If I have more than 10 backup files, I would like to remove the oldest files, so that the 10 newest backup files are the only ones that are left.
So far, I know how to count the files, which seems easy enough, but how do I then remove the oldest files, if the count is over 10?
if [ls /backups | wc -l > 10]
then
echo "More than 10"
fi
The proper way to do this type of thing is with
logrotate
.I like the answers from @Dennis Williamson and @Dale Hagglund. (+1 to each)
Here's another way to do it using
find
(with the-newer
test) that is similar to what you started with.This was done in bash on cygwin...
Try this:
This should handle all characters (except newlines) in a file name.
What's going on here?
ls -t
lists all files in the current directory in decreasing order of modification time. Ie, the most recently modified files are first, one file name per line.sed -e '1,10d'
deletes the first 10 lines, ie, the 10 newest files. I use this instead oftail
because I can never remember whether I needtail -n +10
ortail -n +11
.xargs -d '\n' rm
collects each input line (without the terminating newline) and passes each line as an argument torm
.As with anything of this sort, please experiment in a safe place.
find
is the common tool for this kind of task :EXPLANATIONS
./my_dir
your directory (replace with your own)-mtime +10
older than 10 days-type f
only files-delete
no surprise. Remove it to test yourfind
filter before executing the whole commandAnd take care that
./my_dir
exists to avoid bad surprises !Using inode numbers via stat & find command (to avoid pesky-chars-in-file-name issues):
On a very limited chroot environment, we had only a couple of programs available to achieve what was initially asked. We solved it that way:
Explanation:
FILE_COUNT=$(ls -l | grep -c ^d )
counts all files in the current folder. Instead of grep we could use alsowc -l
but wc was not installed on that host.FILE_COUNT=$[$FILE_COUNT-1]
update the current$FILE_COUNT
FILE_TO_DEL=$(ls -t | tail -n1)
Save the oldest file name in the$FILE_TO_DEL
variable.tail -n1
returns the last element in the list.