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