Ситуация, когда в кэше накапливается несколько гигабайт пакетов, думаю, известна многим. Так же как и стандартное решение — удаление неустановленных пакетов
Команда очистит директорию "/var/cache/apt/archives/", удалив все, а
удалит не только старые версии пакетов локального кэша, но все, которые больше не доступны для скачивания.
Однако, зачастую необходимо удалить лишь устаревшие пакеты, не трогая при этом все остальные.
Когда я столкнулся с этой проблемой в своем ArchLinux'e, то тут же написал небольшой скрипт на bash'е, статья о котором была недавно опубликована.
Скрипт ищет повторяющиеся пакеты и удаляет все, кроме того, у которого дата создания позднее — это гораздо проще, чем сравнивать версии пакетов.
![image](https://habrastorage.org/r/w1560/getpro/geektimes/post_images/48f/402/6a7/48f4026a778728f01bb87fc532732cc7.png)
Для pacman'а описанная проблема решается с помощью утилиты repo-clean, однако программа создана специально для ArchLinux, хоть и на C++. Посему,
Вам в консоль! =)
$ 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](https://habrastorage.org/getpro/geektimes/post_images/48f/402/6a7/48f4026a778728f01bb87fc532732cc7.png)
Для pacman'а описанная проблема решается с помощью утилиты repo-clean, однако программа создана специально для ArchLinux, хоть и на C++. Посему,
$ yaourt -S repo-clean
Вам в консоль! =)