У меня есть каталог резервных копий, который выглядит так:
-rw-r--r-- 1 ftpuser ftponly 5610595 May 27 00:01 alpha-114.tar.asc
-rw-r--r-- 1 ftpuser ftponly 50559368 May 27 00:04 beta-211.tar.asc
-rw-r--r-- 1 ftpuser ftponly 61320807 May 27 00:06 gamma-387.tar.asc
-rw-r--r-- 1 ftpuser ftponly 43125044 May 27 00:07 epsilon-241.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107110560 Apr 26 04:33 zeta-7728.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107136555 Apr 27 00:29 zeta-7729.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107154163 Apr 28 00:29 zeta-7731.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107194763 May 1 00:33 zeta-7734.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107200582 May 2 00:33 zeta-7736.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107203436 May 4 00:32 zeta-7737.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107250397 May 7 00:33 zeta-7739.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107269251 May 8 00:26 zeta-7741.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107917088 May 9 00:32 zeta-7747.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1107914021 May 10 00:22 zeta-7748.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1113095971 May 11 00:32 zeta-7751.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1114420811 May 12 00:32 zeta-7756.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1114433146 May 13 00:31 zeta-7757.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1114437345 May 14 00:32 zeta-7758.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1114437862 May 16 00:29 zeta-7762.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1115062371 May 17 00:29 zeta-7778.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1115068367 May 18 00:30 zeta-7781.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1115067272 May 19 00:24 zeta-7782.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1115077719 May 20 00:26 zeta-7784.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1115080120 May 22 00:25 zeta-7785.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1115076554 May 23 00:33 zeta-7786.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1115877146 May 24 00:26 zeta-7789.tar.asc
-rw-r--r-- 1 ftpuser ftponly 1115967469 May 27 00:53 zeta-7795.tar.asc
Я хочу удалить все, кроме трех последних, каждого префикса файла, поэтому в данном случае все файлы zeta - ****. Tar.asc, кроме трех последних. У меня есть сложный скрипт Perl, который выполняет это, но я бы хотел сделать это с помощью bash.
Отличные фрагменты приветствуются!
Ты можешь использовать tail -n +3
чтобы дать вам все без начальных 3 строк вывода из ls -1t
например
ls -1t zeta* | tail -n +3 | xargs rm
Это перечисляет все файлы от самых новых до самых старых в одном столбце, который затем обрабатывает и выводит список файлов после начальных 3 (самых новых) файлов.
ls -lt prefix*suffix | gawk ' { if ($NR > 3) print $NF } ' | xargs rm
Работает для меня. Не является надежным. Без гарантии. Ваш пробег может отличаться.
Это должно работать для произвольного количества префиксов, если они соответствуют соглашению о префиксе имени:
for i in `ls | sed 's/-.*//' | uniq`; do ls -t $i-* | awk '{if(NR>3) print}' | xargs rm -f; done
Это удалит все файлы старше 3 дней. Вы можете изменить это. Это в основном ищет файлы, время изменения которых меньше, чем now () - 3 дня, и удаляет их.
find $PATH -mtime -3 -type f -exec rm {}
При желании вы можете определить флаг "-iname" для поиска определенного шаблона в именах файлов.
-iname suffix*prefix
Дополнительные параметры см. В разделе «Поиск страниц руководства».