13.01.13

Грамотная очистка /var/cache/pacman/pkg


Selectively clean cache

  • Use paccache from pacman-contrib to clean the /var/cache/pacman/pkg directory while allowing to specify how many package versions should be retained (default is 3):
paccache -rv
To list all the options:
paccache -h
  • Because paccache does not remove the cache of uninstalled packages, you can display them with diff from diffutils and then optionally delete each package in the /var/cache/pacman/pkg directory:
pacman -S diff
diff -y <(pacman -Qq) <(ls /var/cache/pacman/pkg/ | sed 's/^\(.*\)-[^-]*-[^-]*-[^-]*$/\1/' | sort -u)
If you want to display the output with colors install colordiff:
pacman -S colordiff
colordiff -y <(pacman -Qq) <(ls /var/cache/pacman/pkg/ | sed 's/^\(.*\)-[^-]*-[^-]*-[^-]*$/\1/' | sort -u)


cacheclean — это скрипт на python для отчистки /var/cache/pacman/pkg работающий по аналогии с pacman -Sc, но имеющий одну важную особенность — он позволяет указать количество сохраняемых версий пакетов и, так же как repo-clean, упомянутый в Arch FAQ & Tips, не удаляет пакеты не установленные в данный момент. 
Т.е. repo-clean удаляет все файлы пакетов акромя последней версии, а cacheclean позволяет указать сколько последних версий сохранять… 

pkgcacheclean — аналог cacheclean, но уже написан на сях и удаляет все неиспользуемые пакеты, грубо говоря это pacman -Sc && cacheclean 2 (2, ибо pkgcacheclean по умолчанию оставляет две последнии версии пакета, хотя количество оставляемых версий можно изменить). 

Обе утилитки имеются в AUR 

Ну и не забываем о опции CleanMethod = KeepCurrent в pacman.conf позволяющей 
оставлять не установленные пакеты с помощью pacman -Sc

Ситуация, когда в кэше накапливается несколько гигабайт пакетов, думаю, известна многим. Так же как и стандартное решение — удаление неустановленных пакетов
$ 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 по функциональности, т.к. основная опция — это количество версий, которые нужно оставить в сохранности.