Faster way to delete large number of files
find … -exec rm {} \;
executes the rm
command for each file. Even though starting a new process is pretty fast, it's still a lot slower than the mere act of deleting a file.
find … -exec rm {} +
would call rm
in batches, which is a lot faster: you pay the cost of running rm
once per batch, and each batch performs many deletion.
Even faster is to not invoke rm
at all. The find
command on Linux has an action -delete
to delete a matching file.
find ./cache -type f -mtime +0.5 -delete
However, if you're producing files at such a rate that find … -exec rm {} \;
can't keep up, there's probably something wrong with your setup. If cache
contains millions of files, you should split it into subdirectories for faster access.
Try using xargs
:
find ./cache -mtime +0.5 -print0 | xargs -0 rm -f
Update explaination for @pradeepchhetri
If you use find
with -exec
, every file that find
found will call rm
one time. So if you found a huge of files, i.e 10000 files, you called rm
10000 times.
xargs
will treat ouput of find
as command argument to rm
, so that, xargs will provide as many arguments as rm
can handle at once, i.e rm -f file1 file2 ...
So it makes less fork call, make program run faster.