Arch LinuxОчистка кэша Pacman'а

Ситуация, когда в кэше накапливается несколько гигабайт пакетов, думаю, известна многим. Так же как и стандартное решение — удаление неустановленных пакетов
$ pacman -Sc
или полная очистка кэша
$ pacman -Scс

Однако, зачастую необходимо удалить лишь устаревшие пакеты, не трогая при этом все остальные.

Когда я столкнулся с этой проблемой, то тут же написал небольшой скрипт на bash'е:
#!/bin/bash
// переходим в нужную нам директорию
cd
"/var/cache/pacman/pkg/";
// забираем список пакетов
files
=(`ls | grep pkg.tar.gz`)
// делаем список имен пакетов (которые могут повторяться)
pkgs
=(`ls | grep pkg.tar.gz | sed 's/-[0-9].*//'`);
// вычисляем длину массивов
filesLen
=${#files[@]}
// перебираем элементы массива pkgs в поисках повторов
for (( i=0; i<$filesLen-1; i++ ));
do
        echo
"cheking ${pkgs[$i]} package...";
       
for (( j=$i+1; j<${filesLen}; j++ ));
       
do
               
// если находим повтор
               
if [ ${pkgs[$i]} = ${pkgs[$j]} ]; then
                       
// сравниваем файлы по дате создания
                       
// чтобы удалить старый из двух имеющихся
                       
if [ ${files[$i]} -ot ${files[$j]} ]; then
                                echo
"found ${files[$j]}";
                                echo
"removed ${files[$i]}";
                                rm
-Rf ${files[$i]};
                               
break;
                       
else
                                echo
"found ${files[$i]}";
                                echo
"removed ${files[$j]}";
                                rm
-Rf ${files[$j]};
                       
fi
               
fi
       
done
done

Скрипт ищет повторяющиеся пакеты и удаляет все, кроме того, у которого дата создания позднее.

Однако, как оказалось, данную проблему уже решил человек с ником smirnoffjr, написав программу на С++ под названием repo-clean, которая доступна в AUR'е
yaourt -S repo-clean


Программа умеет перемещать в другую директорию (режим move) и удалять старые версии пакетов (режим clean), или просто выдавать список тех, которые имеют больше одной версии в кэше (режим dry-run). А также поддерживает исключения для указанных пакетов, для этого нужно создать файл ~/.repocleanrc и определить параметр ignore, например, так:
ignore=kernel26rt,mesa


Так же существует неплохой скрипт на python'е, который приведен в вики на официальном сайте, но уступает программе repo-clean по функциональности, т.к. основная опция — это количество версий, которые нужно оставить в сохранности.
  • +11
  • ha7y
  • 06 июня 2009, 00:56

Комментарии (7)

  • avatar
  • m1o
  • 06 июня 2009, 01:03
  • #
  • 1
Большое спасибо. Как раз вчера столкнулся с этой проблемой.
Рад, что помог! =)
Кто сталкивался с такой проблемой объясните зачем оставлять неустановленные пакеты. Пакет либо установлен, если он нужен, либо его не жалко удалить.
Для того, чтобы не качать его заново из сети в случае чего.
Пока с такими проблемами не сталкивался, но скриптик в закладки добавлю.
Сделал скрипт для apt-get'а и Debian'ских пакетов по просьбе хорошего человека ;-)
А вот это уже актуальнее.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.