简体   繁体   中英

Shell script to delete all folders but the last 5 ones

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.

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?"

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 {}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM