pacman -Sc

Вот это считалось багом: http://bugs.archlinux.org/task/8061 . Теперь при попытке очистить кэш и отрицательном ответе на вопрос "Do you want to remove uninstalled packages from cache? " pacman не удаляет старые пакеты. Все таки это баг или фича?
вообще, pacman - фича archlinux ;)
Разберемся, голубчик!
а как должно быть? ;)
такие дела.
cucullus
а как должно быть? ;)

До версии 3.1 удалялись старые версии пакетов, но оставались не инсталлированные. Теперь же он сносит и старые и не инсталлированные, если сказать “Yes” на вопрос из предыдущего поста. В случае отказа - ничего не происходит.
ну это вопрос терминологический. ;) старый пакет тоже ведь не инсталлирован.
в любом случае нужные вещи только в кэше лучше не держать.
такие дела.
Данный факт меня опечалил :( , хоть на старую версию откатывайся.
Как хорошо раньше - в крон прописал yes|pacman -Syu && yes|pacman -Sc
и никаких заморок. А сейчас придется скрипт придумывать…
Я тупо выдрал из сорцов пекмана функцию clean_cache() со всеми функциями которые она использует и собрал отдельную програмульку. 
В общем может кому еще пригодится.  Так как тупо выдрал код - ответственности за работу не несу, но сам использую.

Собирать так: gcc -lalpm -o ./cache_cleaner ./cache_cleaner.c.
./cache_cleaner - чистить /var/cache/pacman/pkg/
./cache_cleaner <dir> - соответствующую директорию.

Работает с последним пакманом 3.1.1-1.  В конце добавил возможность подтверждения удаления файла, чтобы убедится, что все работает корректно.

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <alpm.h>
#include <libintl.h>
#define _(str) gettext(str)
#define PM_EXT_PKG ".pkg.tar.gz"
/* internal */
static char *_supported_archs[] = {
	"i586",
	"i686",
	"ppc",
	"x86_64",
};
char *alpm_pkg_name_hasarch(char *pkgname)
{
	/* TODO remove this when we transfer everything over to -ARCH
	 *
	 * this parsing sucks... it's done to support
	 * two package formats for the time being:
	 *    package-name-foo-1.0.0-1-i686
	 * and
	 *    package-name-bar-1.2.3-1
	 */
	size_t i = 0;
	char *arch, *cmp, *p;
	if((p = strrchr(pkgname, '-'))) {
		for(i=0; i < sizeof(_supported_archs)/sizeof(char*); ++i) {
			cmp = p+1;
			arch = _supported_archs[i];
			/* whee, case insensitive compare */
			while(*arch && *cmp && tolower(*arch++) == tolower(*cmp++)) ;
			if(*arch || *cmp) {
				continue;
			}
			return(p);
		}
	}
	return(NULL);
}
/* Trim whitespace and newlines from a string
 */
char *strtrim(char *str)
{
	char *pch = str;
	while(isspace(*pch)) {
		pch++;
	}
	if(pch != str) {
		memmove(str, pch, (strlen(pch) + 1));
	}
	
	pch = (char *)(str + (strlen(str) - 1));
	while(isspace(*pch)) {
		pch--;
	}
	*++pch = '\0';
	return str;
}
/* presents a prompt and gets a Y/N answer */
/* TODO there must be a better way */
int yesno(char *fmt, ...)
{
	char response[32];
	va_list args;
    /*
	if(config->noconfirm) {
		return(1);
	}
    */
	va_start(args, fmt);
	/* Use stderr so questions are always displayed when redirecting output */
	vfprintf(stderr, fmt, args);
	va_end(args);
	if(fgets(response, 32, stdin)) {
		if(strlen(response) != 0) {
			strtrim(response);
		}
		if(!strcasecmp(response, _("Y")) || 
			!strcasecmp(response, _("YES")) || 
			strlen(response) == 0) {
			return(1);
		}
	}
	return(0);
}
static int split_pkgname(char *target, char *name, char *version)
{
	char tmp[512];
	char *p, *q;
	if(target == NULL) {
		return(-1);
	}
	/* trim path name (if any) */
	if((p = strrchr(target, '/')) == NULL) {
		p = target;
	} else {
		p++;
	}
	strncpy(tmp, p, 512);
	/* trim file extension (if any) */
	if((p = strstr(tmp, PM_EXT_PKG))) {
		*p = '\0';
	}
	
	/* trim architecture */
	if((p = alpm_pkg_name_hasarch(tmp))) {
		*p = '\0';
	}
	p = tmp + strlen(tmp);
	for(q = --p; *q && *q != '-'; q--);
	if(*q != '-' || q == tmp) {
		return(-1);
	}
	for(p = --q; *p && *p != '-'; p--);
	if(*p != '-' || p == tmp) {
		return(-1);
	}
	strncpy(version, p+1, 64);
	*p = '\0';
	strncpy(name, tmp, 256);
	return(0);
}
int clean_cache(const char *cachedir)
{
	DIR *dir;
	struct dirent *ent;
	alpm_list_t *cache = NULL, *clean = NULL, *i, *j;
    printf(_("Cache directory: %s\n"), cachedir);
    if(!yesno(_("Do you want to remove uninstalled packages from cache? [Y/n] "))) {
        return(0);
    }
    printf(_("removing old packages from cache... \n"));
    dir = opendir(cachedir);
    if(dir == NULL) {
        fprintf(stderr, _("error: could not access cache directory\n"));
        return(1);
    }
	
	rewinddir(dir);
	while((ent = readdir(dir)) != NULL) {
	  if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) {
		continue;
	  }
	  cache = alpm_list_add(cache, strdup(ent->d_name));
	}
	closedir(dir);
	
    for(i = cache; i; i = alpm_list_next(i)) {
	    char *str = alpm_list_getdata(i);
	    char name[256], version[64];
        if(strstr(str, PM_EXT_PKG) == NULL) {
		    clean = alpm_list_add(clean, strdup(str));
		    continue;
	    }
        if(split_pkgname(str, name, version) != 0) {
            clean = alpm_list_add(clean, strdup(str));
            continue;
        }
        for(j = alpm_list_next(i); j; j = alpm_list_next(j)) {
            char *s = alpm_list_getdata(j);
            char n[256], v[64];
            if(strstr(s, PM_EXT_PKG) == NULL) {
                continue;
            }
            if(strstr(s, PM_EXT_PKG ".part")) {
                continue;
            }
            if(split_pkgname(s, n, v) != 0) {
                continue;
            }
            //printf("compare %s with %s\n", name, n);
            /* TODO Do not remove the currently installed version EITHER */
            if(!strcmp(name, n)) {
                char *ptr = (alpm_pkg_vercmp(version, v) < 0) ? str : s;
                if(!alpm_list_find_str(clean, ptr)) {
                    clean = alpm_list_add(clean, strdup(ptr));
                }
            }
        }
	}
	
	for(i = clean; i; i = alpm_list_next(i)) {
	    char path[PATH_MAX];
	    snprintf(path, PATH_MAX, "%s/%s", cachedir, (char *)alpm_list_getdata(i));
		printf("unlink %s\n", path);		
		if(yesno(_("Remove [Y/n]")))
	  		unlink(path);
	}
}
int main(int argc, char **argv)
{
    char *cachedir = (NULL == argv[1]) ? "/var/cache/pacman/pkg" : argv[1];
    clean_cache(cachedir);
    return EXIT_SUCCESS;
}
а он(cache_cleaner) оставит то что сейчас установлено?
hedgehog
а он(cache_cleaner) оставит то что сейчас установлено?

Удаляются только дубликаты пакетов с меньшей версией и файлы, информации о которых нет в локальной базе репозиториев.

Пример:

#ls

123 - будет удален
123.pkg.tar.gz  - будет удален
dnsutils-9.4.2-1-i686.pkg.tar.gz  - останется, хотя в системе не установлен, но такой пакет существует в core
psi-0.11-2-i686.pkg.tar.gz  - будет удален
psi-0.11-2.2-i686.pkg.tar.gz - актуальная версия останется
 
Зарегистрироваться или войдите чтобы оставить сообщение.