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

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

    Подробнее
    Реклама

    Комментарии 6

      0
      Спасибо. В моём Дебиане уже прилично накопилось.
        0
        Вам спасибо за инвайт!
        P.S.: На живом Дебиане тестировал мало, так что будьте осторожны
          0
          $ sudo aptitude autoclean
          Удалить старые загруженные файлы пакетов.
            0
            > $ sudo aptitude autoclean
            > Удалить старые загруженные файлы пакетов.
            Позволю себе продолжить:
            … которые нельзя больше скачать.
            Т.е. в том числе и убранные из репозитория пакеты

        • НЛО прилетело и опубликовало эту надпись здесь
            +1
            в gentoo это делаестя простой командой eclean-dist -d

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое