1

I'm looking for a variant on the following script to delete all folders except the last 5 created:

find ./ -type d -ctime +10 -exec rm -rf {} +

So this will delete everything older than 10 days.

But the time factor in my case does not always apply. I need a similar script to delete folders, but I always want to keep the last 5 created folders (by date).

So when there are 100 folders, it needs to delete 95 of them and keep the last 5 created.

When there are 5, it needs to keep them all.

When there are 6, it needs to delete only the first created and keep the other 5.

Zumo de Vidrio
  • 2,021
  • 2
  • 15
  • 33
Redox
  • 981
  • 3
  • 12
  • 29

2 Answers2

0

First find the files printed with a leading date in column #1, sort by date, omit the last 5 newest items from the list, (the ones to keep), remove column #1, and then rm whatever older directories are left. Test code with echo first:

find . -type d -printf '%T@ %p\n' | sort -n | 
head -n -5 | cut -f2- -d" " | xargs -0 echo rm -rd

...and only if it looks OK, remove the echo to do the deed:

find . -type d -printf '%T@ %p\n' | sort -n | 
head -n -5 | cut -f2- -d" " | xargs -0 rm -rd

Some of the above code stolen from plundra's answer to "How to recursively find the latest modified file in a directory?"

agc
  • 7,973
  • 2
  • 29
  • 50
0

Pretty much untested, hence the 'ls -ld' at the end! :)

find ./ -type d -printf '%T@ %p\n' | sort -nr | cut -d' ' -f2- | grep "^....*" | tail --lines=+5 | xargs -i ls -ld {}
Richard Nixon
  • 839
  • 6
  • 9