Joseph Tux

search

un raccourci pour apt-cache search, et un peu plus
mercredi 23 juillet 2014 par Joseph Tux

Sous Debian et sa descendance, on peut chercher dans la liste des packages ceux qui contiennent une expression (dans leur description).
Cette commande est : apt-cache search [regexp]

search est un script Perl qui répond à la question apt-cache search regexp , et affiche les résultats après un signe « + » pour les paquets installés ou « - » pour les autres.

Quand je cherche quelque-chose, je sais donc en même temps quels sont les paquets trouvés déjà installés ou non.
Un « | grep ’^[+]’ » (ou « | grep ’^[-]’), sur la sortie permet aussi de les filtrer.

Voici le code brut, en attendant une relecture et un nettoyage.
(je n’ai jamais souffert d’erreur ni de défaillance depuis des années que je l’utilise abondamment)

#! /usr/bin/perl -w
use strict;
use diagnostics;
use File::Basename;
use Carp ;

### apt-cache search [regexp]
### Affichage préfixé selon l'installation.

# Dépendances
# utilise:
#        "apt-cache search motif"                = trouve les paquets
#        "dpkg --get-selections"                        = liste les paquets installés
#        = pour réafficher la sortie de search, précédée d'un signe + (installé) ou - (non installé)

# Argument de recherche ( : regexp ):
my $pa_t;
if (scalar @ARGV == 1 ) {
   ($pa_t)=@ARGV;            ## argument pour apt-cache search
   }
elsif (scalar @ARGV > 1 ) {
   ($pa_t)=@ARGV;        ## argument pour apt-cache search
   print "($pa_t) seront pris en compte séparément:\n"
   }
else {
   my $basescript=basename($0);
   print "SYNTAXE: $basescript regex ; regex ne peut pas être vide\n";
   exit 1;
};

my $trouv;
my $oui;            #liste des paquets installés:
my @reponse;        # Tableau résultat:
# compteurs (déboggage)
my $c=0;
my $p=0;
my $m=0;
my $t;

## sous bash 5.6:
## system renvoie faux pour vrai et vice-versa : donc and au lieu de or en cas d'échec:
## Perl6::Builtins qw(system) devrait modifier cette anomalie, mais n'est pas installé (cpanm échoue à l'installer)
system(" apt-cache search $pa_t > /tmp/search-list ")
       and croak "apt-cache search échoue à écrire dans le fichier /tmp/search-list";
system("dpkg --get-selections |egrep install | egrep -v deinstall > /tmp/pkg-selection")
       and croak "dpkg --get-selections échoue à écrire dans le fichier /tmp/pkg-selection";

## Pour chaque paquet trouvé par apt-cache search :       
open SEARCH, "/tmp/search-list" or die "/tmp/search-list inutilisé";
while ( $trouv = <SEARCH> ) {
        my $desc= $trouv;        ## pour affichage avec description
        chomp $desc;        ## pour affichage sans interligne blanche
        ## ne garder que le nom: (ellimine description)
        $trouv=~ s/^\W*(\S+)\s.*/$1/;
#        $c ++;                                                        # compteur
        chomp $trouv;                                        # Placé ici, chomp est OK
#                print ":$oui:\n";
#                print "$c        $trouv\n";
#-----------------------------------------

        open INSTALL, "/tmp/pkg-selection" or die "/tmp/pkg-selection inutilisé";

## Le comparer à chaque PAQUET INSTALLE:
        while ( $oui = <INSTALL> ) {                ## 1ère boucle = la plus longue
               
                ## ne garder que le nom: (ellimine espace et mot "installé")
                $oui=~ s/^\W*(\S+)\s+.*/$1/;
                ## éviter les doubles "+" (++): (  c regex coinçait avec le pack "g++")
                $oui=~ s/\++/\+/;
                chomp $oui;                                                # Placé ici, chomp est OK
#------------------------------------------
##        Comparer:
                if ($trouv eq $oui)  {
                        ##---> sauf si option -0:
                        #---> unless () {
                print "+$desc\n";
                        #---> };
                $p ++;
                $c ++;
                };        ## fin de if
        };        ## fin de while oui
        ## LISTE DES PAQUETS TROUVES NON INSTALLES:
        ##---> si option -n activée:
        #---> if () {
        if ($c == 0) {
        print "-$desc\n" ;
        $m ++;
        }
        $c=0;
        #---> };
};        ## fin de while trouv
$t=$p+$m;
print "\nSur $t paquets trouvés: $p installés - $m non installés \n";

Accueil | Contact | Plan du site | | Statistiques du site | Visiteurs : 135 / 59165

Suivre la vie du site fr  Suivre la vie du site GNU, LINUX, BSD, LL  Suivre la vie du site AIDES GNU/LINUX  Suivre la vie du site Administration : astuces, stratégies  Suivre la vie du site Mes scripts   ?

Site réalisé avec SPIP 3.1.6 + AHUNTSIC

Creative Commons License