Page 1 sur 2

[yaourt][Script] nettoyage dépot local (résolu)

Publié : ven. 18 sept. 2009, 14:56
par wido
Bonjour,
Y-a-t-il une commande pour nettoyer le cache de pacman, en ne supprimant que les vieilles versions des programmes et qu'il ignore les paquets non installés?
parce que pacman -Sc nettoie les vieux paquets non installés. alors que moi je veux qu'il l'ignore :)

EDIT:

Code : Tout sélectionner

#!/bin/sh

TEMPORAIRE=/media/HDD120/tmp
PACMAN_CACHE=/media/HDD120/pkg
mkdir $TEMPORAIRE
#\1 nom
#\2 version
#\3 release
#\5 architecture
SED_PKG='\(.*\)-\(.*\)-\([0-9]\+\)\(-\(i686\|x86_64\|any\)\)\{0,1\}\.pkg\.tar\..*$'

cd "$PACMAN_CACHE"
ls | sed "s/$SED_PKG/\\1/" | uniq -c \
   | sort -nr | grep -v '^ *1 ' | \
   while read num pkg 
do
   lastver="0"
for version in $(ls "$pkg"* | grep "$pkg-\([^-]*\)-\([0-9]\+\)\(-\(i686\|x86_64\|any\)\)\{0,1\}\.pkg\.tar\..*$" | sed "s/$SED_PKG/\\2-\\3/")
   do
      ret=$(vercmp "$lastver" "$version")
      [ $ret -lt 0 ] && lastver="$version"
   done
condemned=$(ls "$pkg"* | grep "$pkg-\([^-]*\)-\([0-9]\+\)\(-\(i686\|x86_64\|any\)\)\{0,1\}\.pkg\.tar\..*$" | grep -Fv "$lastver")
   mv $condemned $TEMPORAIRE
done
J'utilise maintenant repo-clean (AUR)

Code : Tout sélectionner

yaourt -S repo-clean
explication dans mon dernier post.

Re: [yaourt] nettoyage mais...

Publié : ven. 18 sept. 2009, 16:46
par marc[i1]
non ce n’est pas possible avec pacman/yaourt.

Pacman -Sc supprime les paquets non installés, il ne sait pas faire la différence entre un vieux et un non-installé-mais-que-tu-gardes … pour lui, le pkg n’est pas dans sa base donc … pouf !

Re: [yaourt] nettoyage mais...

Publié : ven. 18 sept. 2009, 18:17
par wido
Ok merci, dans ce cas connais tu un moyen de le faire? script, programme,...

par ce que le faire à la main c'est chiant :lol:

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 20:50
par Abazigal
Je n'ai pas super bien compris ce que tu voulais mais quoi qu'il en soit, ca à l'air de pouvoir être reglé facilement par un petit script maison, non ?

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 21:01
par wido
pour faire simple , c'est que je n'efface jamais mon cache comme j'ai une petite connection internet (1Mo) je fais des backup pour une éventuelle installation , le problème c'est que pour nettoyer je le fais à la main, et pour l'histoire du script je cherche mais si tu veux m'aider ce serait pas mal :P

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 21:07
par Abazigal
Et le script en question, il supprimerait quoi du coup; toute les anciennes versions ? du style si t'as

coreutils-7.5-2-x86_64.pkg.tar.gz
coreutils-7.6-1-x86_64.pkg.tar.gz

il supprime "coreutils-7.6-1-x86_64.pkg.tar.gz" et laisse l'autre (la plus récente) ?

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 21:17
par wido
qu'il ne garde que les versions plus récents,
il supprime "coreutils-7.6-1-x86_64.pkg.tar.gz" et laisse l'autre (la plus récente) ?
ce ne serait pas plutôt:
il supprime "coreutils-7.5-2-x86_64.pkg.tar.gz" et laisse l'autre (la plus récente) ?
:D

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 21:20
par Abazigal
Effectivement :lol:

ps: j'ai rien d'autre à faire, ce soir; je vais essayer de faire le script.
ps2: et donc, c'est quoi l'histoire d'ignorer les paquets pas installé ? il les supprime pas c'est ca ?

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 21:31
par wido
quand un paquet n'est pas installé il le supprime,

pour le script, il faudrait séparer le nom du paquet en
(coreutils)-(7.6-1)-(x86_64).(pkg.tar.gz)

et analyser la seconde partie, le plus compliqué c'est de le mettre en œuvre :)
si coreutils est le même nom que le seconde fichier alors j'analyse la partie version ...

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 22:04
par Abazigal
Bon, plusieurs trucs chiant:
- Les noms de certains paquets (genre ceux de archlinux-fr, pour ne pas les citer) ne sont pas formaté pareil que les autres.
- Certaines versions sont très ... éxotiques :? genre vi : "vi 050325-1"

Ça gène à l'avancement de la chose ... :|

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 22:19
par benjarobin
Mais non c'est plutôt simple moi je trouve, il suffit de splitter la chaine selon certaine règle, puis de parser chaque morceau en int, puis de créer un tableau. J 'ai un code que j'ai pondu en java (pas de commentaire) pour mon entreprise (je n'ai pas le droit normalement mais bon...)

Code : Tout sélectionner

	
	/**
	 * Convert a string array to an integer array with size: sizeOutArray.
	 * @param verArray the number of the version.
	 * @param sizeOutArray the size of the array that we need to return.
	 * @return an array of integer of the version.
	 */
	private static int[] stringArrayToIntArray(String verArray[], int sizeOutArray)
	{
		int outIntArray[] = new int[sizeOutArray];
		if(verArray!= null && verArray.length <= sizeOutArray)
		{
			try {
				for(int i=0; i<verArray.length; i++) {
					outIntArray[i] = Integer.parseInt(verArray[i]);
				}
			} catch(Exception e) { 
				logger.warn("Fail to parse the array of the version.", e);
			}
		}
		return outIntArray;
	}
	
	/**
	 * Function to check the version of the template.
	 * @param minVersion the string of the version for example (1.4.13)
	 * @param templateVersion the string that return {@link #getTemplateVersion(String, String)}
	 * @return true if the template is not too old.
	 */
	public static boolean isValidVersion(String minVersion, String templateVersion)
	{
		if(minVersion == null || templateVersion == null || templateVersion.charAt(0) != 'v') {
			return false;
		}
		templateVersion = templateVersion.substring(1);
		try {
			String verFileStr[] = templateVersion.split("\\.");
			String minFileStr[] = minVersion.split("\\.");
			int maxSize = Math.max(verFileStr.length, minFileStr.length);
			int verFile[] = stringArrayToIntArray(verFileStr, maxSize);
			int minFile[] = stringArrayToIntArray(minFileStr, maxSize);
			
			for(int i=0; i<maxSize; i++)
			{
				if(verFile[i] > minFile[i]) {
					return true;
				} else if(verFile[i] < minFile[i]) {
					return false;
				}
			}
			return true;
			
		} catch(Exception e) {
			return false;
		}
	}
Bon c'est brute de décoffrage, est le but ici c'est de comparer 2 versions, ici les version sont assez simple, mais je montre l'idée, ici, comme c'est en java, pas besoin d'initialiser le tableau a 0, je parle de outIntArray

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 22:27
par Abazigal
Le découpage n'est pas du tout simple, nan; Pour plusieurs raisons:
- certains noms de paquets ont des tiret dans leur nom (donc pas de cut de premier field avec tiret comme délimiteur
- selon les paquets, il y a plus ou moins de tirets dans la partie "Hors Nom" (il y en a 3 normalement, mais 2 dans le nom des paquets d'archlinux-fr)

Mais ca devrait bientôt être réglé, là, je suis sur la bonne voie :p Le Shell vaincra ^^

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 22:28
par wido
il faudrait c'est commencer par la fin des noms
par exemple:

Code : Tout sélectionner

#ARCH=$(cut -d '-' -f4)
#NOM=$(cut -d '-' -f1)
#VERSION=$(cut -d '-' -f2)
#RELEASE=$(cut -d '-' -f3)
ceux qui donnerait pour le nom:

Code : Tout sélectionner

$echo "acetoneiso2-2.0.4-1-x86_64.pkg.tar.gz" | cut -d '-' -f1
acetoneiso2
je m'y connais pas des masses en programmation mais si ça peut aider

Re: [yaourt] nettoyage mais... (en cours)

Publié : ven. 18 sept. 2009, 22:39
par Abazigal
Oui, mais comme je l'ai dis, les numéros de champs ne sont pas tout le temps les mêmes; ce n'est pas aussi facile que

Code : Tout sélectionner

Nom = cut -f 1 -d "-"
Bon, j'ai un semblant de truc, assez lent, mais qui à l'air de marcher. Je peaufine, et j'envoi. Ensuite, tu me dis si ca marche, puis j'accelere un peu le bouzin :)

EDIT: Voila le script (plus rapide que la version d'avant :) ). C'est pas du grand art, mais je pense que ca marche. À lancer en root, pour que le fichieràlacon soit bien créée (et pour que les fichiers inutiles soient supprimés).

Code : Tout sélectionner

#!/bin/bash
#Script pour supprimer tout les fichiers inutiles du cache
#On procedera par élimination, en 3 temps:
#- On liste tout les fichiers du cache
#- On enleve de la liste les fichiers à garder
#- On supprime tout les fichiers encore dans la liste

#On va dans le répértoire où on va oeuvrer :p
cd /var/cache/pacman/pkg

#Fichier à la con qui sera supprimé à la fin
touch aaaaaaaaaaa

#On stocke la liste des fichier présent dans le cache
liste_cache=`ls`

#On parcourt la liste de tout les paquets INSTALLÉS
for paq in `pacman -Q | tr ' ' '-'`;do
        #Si on y trouve un paquet du cache (à la même version)
        #On l'enlève de la liste
        if [[ "$liste_cache" =~ "$paq" ]];then
                liste_cache=`echo $liste_cache | sed -r s/"[[:space:]]$paq[^[:space:]]+"/''/g`
        fi
done

#À ce stade, il ne reste plus dans la liste QUE les paquets:
#       -Qui ne sont pas installé sur le système
#       -Qui sont installé dans une version plus récente
#       -Le fichier aaaaaaaaaa

echo Fichiers a supprimer:
echo $liste_cache

#On supprime donc tout les fichiers de la liste
#rm $liste_cache
À toi de me le dire ;) (si ca marche)
Si la liste qu'il te donne correspond bien à ce que toi tu aurais enlever à la main, décomente la dernière ligne et relance le.

Re: [yaourt] nettoyage mais... (en cours)

Publié : sam. 19 sept. 2009, 09:33
par wido
ça a l'air pas mal du tout, j'ai hâte de voir la suite :twisted:
la partie "-Qui ne sont pas installés sur le système" me semble la plus hard

Re: [yaourt] nettoyage mais... (en cours)

Publié : sam. 19 sept. 2009, 09:47
par Abazigal
Il n'y a PAS de suite, le script est complet là :wink:

Tu as testé, ca roule ?
Bein, ceux qui ne sont pas installé sur le système sont supprimés là, comme tu l'avais demandé.

Re: [yaourt] nettoyage mais... (en cours)

Publié : sam. 19 sept. 2009, 12:25
par catwell
À mon avis vous devriez utiliser vercmp pour comparer les versions complexes...

Re: [yaourt] nettoyage mais... (en cours)

Publié : sam. 19 sept. 2009, 12:34
par tuxce
euh là, je crois que t'as seulement refait le "pacman -Sc" (en plus lent :twisted: )

Re: [yaourt] nettoyage mais... (en cours)

Publié : sam. 19 sept. 2009, 12:37
par Abazigal
arf, je sais pas; apparement, il y avait un comportement de pacman -Sc qu'il n'aimait pas. :?
(Question lenteur, la version posté dure moins de 2sec, chez moi, ca me parait convenable)

Re: [yaourt] nettoyage mais... (en cours)

Publié : sam. 19 sept. 2009, 14:41
par wido
il y avait un comportement de pacman -Sc qu'il n'aimait pas.
Oui, c'est tout simplement pour éviter de retélécharger un même paquet que j'avais téléchargé auparavant et de faire de la place pour les vieilles versions. ça fait office de dépôt local.