Как стать автором
Обновить

Очистка локального репозитория от старых пакетов

Время на прочтение2 мин
Количество просмотров5.3K
Ситуация, когда в кэше накапливается несколько гигабайт пакетов, думаю, известна многим. Так же как и стандартное решение — удаление неустановленных пакетов
$ apt-get clean
Команда очистит директорию "/var/cache/apt/archives/", удалив все, а
$ apt-get autoclean
удалит не только старые версии пакетов локального кэша, но все, которые больше не доступны для скачивания.

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

Когда я столкнулся с этой проблемой в своем ArchLinux'e, то тут же написал небольшой скрипт на bash'е, статья о котором была недавно опубликована.

#!/bin/bash
## директория кэша
CACHE_DIR="/var/cache/apt/archives" ## расположение кэша apt-get
#CACHE_DIR="/var/cache/pacman/pkg" ## расположение кэша pacman'а

## расширение пакетов дистрибутива
EXT="deb"
#EXT="pkg.tar.gz" ## расширение пакетов ArchLinux'а

## фильтр, стирающий ненужную информацию из названий пакетов
FILTER="sed s/_[0-9].*_//"
#FILTER="sed s/-[0-9].*//" ## фильтр для пакетов ArchLinux'а

function remove {
	echo -e "$1\t\t\t[removed]";
	rm -f $1;
}

cd "$CACHE_DIR";	## переходим в нужную нам директорию
echo "Changed working dir on `pwd`";

pkgs=(`ls | grep $EXT`);	## забираем список пакетов
hashs=(`ls | grep $EXT | $FILTER`);	## делаем список отфильтрованных названий пакетов

pkgsNum=${#pkgs[@]}	## вычисляем длину массивов
echo "$pkgsNum files in cache now";

for (( i=0; i<$pkgsNum-1; i++ ));
do
	#echo "cheking package ${pkgs[$i]}...";
	for (( j=$i+1; j<${pkgsNum}; j++ ));	## перебираем элементы массива hashes в поисках повторов
	do
		if [ ${hashs[$i]} = ${hashs[$j]} ]; then ## если находим два одинаковых хеша
			if [ ${pkgs[$i]} -ot ${pkgs[$j]} ]; then ## сравниваем файлы по дате создания
				remove ${pkgs[$i]};
				break;
			else
				remove ${pkgs[$j]};
			fi
		fi
	done
done

Скрипт ищет повторяющиеся пакеты и удаляет все, кроме того, у которого дата создания позднее — это гораздо проще, чем сравнивать версии пакетов.
image
Для pacman'а описанная проблема решается с помощью утилиты repo-clean, однако программа создана специально для ArchLinux, хоть и на C++. Посему,
$ yaourt -S repo-clean
Вам в консоль! =)
Теги:
Хабы:
Всего голосов 19: ↑12 и ↓7+5
Комментарии6

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
11 сентября
Митап по BigData от Честного ЗНАКа
Санкт-ПетербургОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн