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

Annonces, dépannage, évolution du projet yaourt
Avatar de l’utilisateur
wido
Chu Ko Nu
Messages : 497
Inscription : mar. 21 oct. 2008, 20:59

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

Message 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.
Dernière modification par wido le dim. 27 déc. 2009, 00:08, modifié 5 fois.
Image
Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)

Re: [yaourt] nettoyage mais...

Message 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 !
Ne vous emmerdez plus, emmerdez les autres.
Avatar de l’utilisateur
wido
Chu Ko Nu
Messages : 497
Inscription : mar. 21 oct. 2008, 20:59

Re: [yaourt] nettoyage mais...

Message 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:
Image
Avatar de l’utilisateur
Abazigal
Chu Ko Nu
Messages : 313
Inscription : sam. 26 avr. 2008, 14:45
Localisation : Seine et Marne

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

Message 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 ?
Avatar de l’utilisateur
wido
Chu Ko Nu
Messages : 497
Inscription : mar. 21 oct. 2008, 20:59

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

Message 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
Image
Avatar de l’utilisateur
Abazigal
Chu Ko Nu
Messages : 313
Inscription : sam. 26 avr. 2008, 14:45
Localisation : Seine et Marne

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

Message 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) ?
Avatar de l’utilisateur
wido
Chu Ko Nu
Messages : 497
Inscription : mar. 21 oct. 2008, 20:59

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

Message 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
Image
Avatar de l’utilisateur
Abazigal
Chu Ko Nu
Messages : 313
Inscription : sam. 26 avr. 2008, 14:45
Localisation : Seine et Marne

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

Message 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 ?
Avatar de l’utilisateur
wido
Chu Ko Nu
Messages : 497
Inscription : mar. 21 oct. 2008, 20:59

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

Message 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 ...
Image
Avatar de l’utilisateur
Abazigal
Chu Ko Nu
Messages : 313
Inscription : sam. 26 avr. 2008, 14:45
Localisation : Seine et Marne

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

Message 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 ... :|
Si les cons savaient voler, il ferait nuit tout le temps ...
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17235
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

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

Message 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
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Abazigal
Chu Ko Nu
Messages : 313
Inscription : sam. 26 avr. 2008, 14:45
Localisation : Seine et Marne

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

Message 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 ^^
Dernière modification par Abazigal le sam. 19 sept. 2009, 10:01, modifié 1 fois.
Si les cons savaient voler, il ferait nuit tout le temps ...
Avatar de l’utilisateur
wido
Chu Ko Nu
Messages : 497
Inscription : mar. 21 oct. 2008, 20:59

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

Message 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
Image
Avatar de l’utilisateur
Abazigal
Chu Ko Nu
Messages : 313
Inscription : sam. 26 avr. 2008, 14:45
Localisation : Seine et Marne

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

Message 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.
Si les cons savaient voler, il ferait nuit tout le temps ...
Avatar de l’utilisateur
wido
Chu Ko Nu
Messages : 497
Inscription : mar. 21 oct. 2008, 20:59

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

Message 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
Image
Avatar de l’utilisateur
Abazigal
Chu Ko Nu
Messages : 313
Inscription : sam. 26 avr. 2008, 14:45
Localisation : Seine et Marne

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

Message 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é.
Si les cons savaient voler, il ferait nuit tout le temps ...
Avatar de l’utilisateur
catwell
archer de cavalerie
Messages : 175
Inscription : lun. 13 juil. 2009, 19:00

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

Message par catwell »

À mon avis vous devriez utiliser vercmp pour comparer les versions complexes...
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

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

Message par tuxce »

euh là, je crois que t'as seulement refait le "pacman -Sc" (en plus lent :twisted: )
Avatar de l’utilisateur
Abazigal
Chu Ko Nu
Messages : 313
Inscription : sam. 26 avr. 2008, 14:45
Localisation : Seine et Marne

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

Message 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)
Avatar de l’utilisateur
wido
Chu Ko Nu
Messages : 497
Inscription : mar. 21 oct. 2008, 20:59

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

Message 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.
Image
Répondre