Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove all files with a common prefix except the N latest modified

Tags:

linux

bash

I am trying to create a bash command/script to remove all files in a directory older than X days that starts with a certain substring.

For example, if our directory contains the files

-rw-r--r-- 1 root root 0 Jun 30 10:22 foo_5
-rw-r--r-- 1 root root 0 Jun 29 10:22 bar_4
-rw-r--r-- 1 root root 0 Jun 29 10:22 foo_4
-rw-r--r-- 1 root root 0 Jun 28 10:22 bar_3
-rw-r--r-- 1 root root 0 Jun 28 10:22 foo_3
-rw-r--r-- 1 root root 0 Jun 27 10:22 bar_2
-rw-r--r-- 1 root root 0 Jun 27 10:22 foo_2
-rw-r--r-- 1 root root 0 Jun 26 10:22 foo_1

we want to delete all foo* files except the 2 most recent one. This will result in the directory

-rw-r--r-- 1 root root 0 Jun 30 10:22 foo_5
-rw-r--r-- 1 root root 0 Jun 29 10:22 bar_4
-rw-r--r-- 1 root root 0 Jun 29 10:22 foo_4
-rw-r--r-- 1 root root 0 Jun 28 10:22 bar_3
-rw-r--r-- 1 root root 0 Jun 27 10:22 bar_2

I am currently only able to delete all files except the 2 most recent, which will affect bar* files.

ls -t | tail -n +4 | xargs rm --

How can we also restrict our deletion to files that starts with a certain string?


Code to create test files

(
touch -d "6 days ago" foo_5
touch -d "7 days ago" foo_4
touch -d "7 days ago" bar_4
touch -d "8 days ago" foo_3
touch -d "8 days ago" bar_3
touch -d "9 days ago" foo_2
touch -d "9 days ago" bar_2
touch -d "10 days ago" foo_1
)
like image 291
Athena Wisdom Avatar asked Dec 10 '25 08:12

Athena Wisdom


1 Answers

Parsing the output of ls is not a good idea. Using tools from GNU coreutils and findutils packages, a fail-safe program to achieve this task can be written as below.

n=2 # except the last two
find -maxdepth 1 -type f -name 'foo*' \
     -printf '%T@\t%p\0'              \
| sort  -z -k 1n,1                    \
| head  -z -n -$n                     \
| cut   -z -f 2-                      \
| xargs -0 rm
like image 156
oguz ismail Avatar answered Dec 12 '25 21:12

oguz ismail



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!