Reputation: 25
I have a delete backup files function which takes in the arguments as a directory name and to backup the files of a specific directory and specific type of file like this delete_old_backup_files $(dirname $$abc) "$abc.*"
The function body is:
local fpath=$1
local fexpr=$2
# delete backup files older than a day
find $fpath -name "${fexpr##*/}" -mmin +1 -type f | xargs rm -f
Currently deleting files that are older than a day. Now I want to modify the function such that this function should delete all backup files of type $abc.*, except the last 5 backup files created. Tried various commands using stat or -printf but couldn't succeed.
What is the correct way of completing this function?
Upvotes: 1
Views: 67
Reputation: 22012
Assuming the filenames do not contain newline characters, would you please try:
delete_old_backup_files() {
local fpath=$1
local fexpr=$2
find "$fpath" -type f -name "${fexpr##*/}" -printf "%T@\t%p\n" | sort -nr | tail -n +6 | cut -f2- | xargs rm -f --
}
-printf "%T@\t%p\n"
prints the seconds since epoch (%T@
) followed
by a tab character (\t
) then the filename (%p
) and a newline (\n
).sort -nr
numerically sorts the lines in descending order (newer first,
older last).tail -n +6
prints the 6th and following lines.cut -f2-
removes the prepended timestamp leaving the filename only.[Edit]
In case of MacOS
, please try instead (not tested):
find "$fpath" -type f -print0 | xargs -0 stat -f "%m%t%N" | sort -nr | tail -n +6 | cut -f2- | xargs rm --
In the stat
command, %m
is expanded to the modification time (seconds since epoch), %t
is replaced with a tab, and %N
to be a filename.
Upvotes: 1
Reputation: 3441
I would use sorting instead of find. You can use ls -t
$ touch a b c
$ sleep 3
$ touch d e f
ls -t | tr ' ' '\n' | tail -n +4
a
b
c
$ ls -t | tr ' ' '\n' | tail -n +4 | xargs rm
$ ls
d e f
From man ls
:
-t sort by modification time, newest first
Make sure you create backups before you delete stuff :-)
Upvotes: 0