Pull to refresh

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

Reading time2 min
Views5K
Ситуация, когда в кэше накапливается несколько гигабайт пакетов, думаю, известна многим. Так же как и стандартное решение — удаление неустановленных пакетов
$ 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
Вам в консоль! =)
Tags:
Hubs:
+5
Comments6

Articles

Change theme settings