Software Center affiche en quelque sorte une liste assez courte de packages installés. Comment l'obtenir dans un fichier texte?
J'ai essayé:
> dpkg --get-selections|wc -l
3265
> aptitude search '~i!~M'|wc -l
1181
> dpkg -l | grep ^ii | sed 's_ _\t_g' | cut -f 2|wc -l
3076
> dpkg --get-selections | grep -v deinstall|wc -l
3076
> apt-mark showmanual|wc -l
1181
Je sais que j'ai installé quelques dizaines de paquets, pas des milliers. Il me faut dans la liste exactement les paquets que j'avais choisis sans dépendances pour le vérifier.
UPDATE
Merci beaucoup à @kos, j'ai finalement obtenu la liste avec cette commande:
> zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install \K.*' | tr ' ' '\n' | grep -v '\-\-reinstall'|grep -v '\-\-force-yes'|grep -v '\-y'|grep -v '\-f'|sort|uniq wc -l
103
Cela ne répond pas exactement à la question: il donne plutôt une commande pour lister toutes les commandes apt-get install
jamais exécutées avec quelques conseils sur la manière d’analyser davantage la liste afin d’obtenir une liste de toutes les commandes. La commande apt-get install
est exécutée, à l'exception de celles exécutées par Ubiquity, car la solution idéale pour cette tâche semble ne pas exister.
zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*'
zcat /var/log/apt/history.log.*.gz
: décompresse tous les journaux apt
compressés dans /var/log/apt
, les concatène et les imprime dans stdout
;cat - /var/log/apt/history.log
: ajoute /var/log/apt/history.log
et imprime dans stdout
;grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*'
: sélectionne uniquement les lignes commençant par Commandline: apt-get
contenant install
avec un espace pour le début et la fin, et affiche le reste de chaque ligne sélectionnée sur stdout
;Cela affichera la liste de toutes les commandes apt-get install
jamais exécutées (la seule sortie indésirable pourrait être une commande apt-get
-non -install
mentionnant un paquet install
, mais ce paquet n'existe pas (encore?), du moins dans les référentiels par défaut);
Remarque: Dans mon installation (Ubuntu 15.04 64 bits), les quatre premières commandes répertoriées sont celles exécutées par Ubiquity lors de l'installation. pour les exclure, vous pouvez diriger la sortie vers sed
:
sed '1,4d'
Ainsi, la dernière commande approximative pour Ubuntu 15.04 64 bits serait:
zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*' | sed '1,4d'
apt-mark showmanual
vous donnera une liste de tous les paquets installés manuellement sans les dépendances - la chose importante à noter est qu'il montrera également quels paquets ont été installés lors de l'installation d'Ubuntu.
Pour écrire la sortie dans un fichier:
apt-mark showmanual> un fichier
Il y a en réalité beaucoup d'autres manières, telles que l'utilisation de cette commande
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Bien que je ne sache absolument pas comment cela fonctionne;)
Les paquets installés par date utilisent cat /var/log/dpkg.log | grep "\ install\ > somefile"
Les paquets installés avec dpkg
utilisent ls -l /var/log/dpkg* > somefile
- celui-ci est probablement ce que vous recherchez.
Ce fichier contient les informations ci-dessus: /var/log/dpkg.log
C'est en fait plus compliqué qu'il n'y paraît, et il y a pas mal de questions similaires sur Ask Ubuntu.
J'ai trouvé qu'en regardant dans /var/log/apt/history.log
et dans les anciennes versions compressées de ce journal, tout ce qui est installé par une commande apt-get install
est répertorié comme étant installé par cette commande.
Alors:
grep "apt-get install" /var/log/apt/history.log
Vous les montrera tous pendant la période couverte par l'historique d'apt actuel. Vous aurez besoin de gunzip
vos anciens journaux et de les récupérer pour pouvoir rassembler toutes vos informations. Les commandes grep peuvent toutes être redirigées dans un fichier texte pour vous donner une liste de Nice.
Ceci n’est probablement utile que dans votre cas si Software Center utilise apt-get install
lors de l’installation. Je sais que le centre de logiciel est un frontal pour apt
mais je ne suis pas sûr qu'il utilise cette commande explicitement.
Voici un script Ruby qui utilise rdepends pour vérifier si un package est une dépendance d'un autre package installé. Cela ne dira pas exactement ce que vous avez sélectionné, mais cela ne dépend pas de vos fichiers journaux (qui peuvent avoir été pivotés).
L'installation des packages répertoriés en tant que packages root installera tous les packages répertoriés dans les packages enfants. Donc, vous devriez vous retrouver avec presque (voir les inconvénients ci-dessous) la même liste de paquets.
La liste des enfants affichera les packages qui sont des dépendances d’autres packages enfants ou root.
Cette approche présente des inconvénients:
Apache2
est répertorié dans les packages enfants, car j'ai également libapache2-mod-php
, libapache2-mpm-itk
et python-letsencrypt-Apache
installé, qui ont Apache2
en tant que dépendance.libapache2-mod-php
et libapache2-mod-php7.0
). Il y a une section listant le cycle probable (vérifiez les ancêtres du paquet pour 5 générations), vous devriez l'inclure pour avoir la même liste de paquets (sauf si j'ai oublié autre chose).#!/usr/bin/env Ruby
class ListRootPackages
def run
count = manual_marked_packages.count
@dependencies ||= {}
@root_packages ||= begin
manual_marked_packages.each_with_index.map do |package, index|
STDERR.print " #{index + 1} / #{count} \r"
intersection = manual_marked_packages & reverse_dependencies(package)
if intersection.any?
@dependencies[package] = intersection
nil
else
package
end
end.compact
end
end
def potential_cyclic_dependences
run
@potential_cyclic_dependences ||= @dependencies.keys.map do |package|
package unless has_root_ancestor?(package, 5)
end.compact
end
def has_root_ancestor?(package, level=0)
return true if @root_packages.include?(package)
return false if level.zero?
@dependencies[package].any? { |parent| has_root_ancestor?(parent, level - 1) }
end
def root_packages
run
@root_packages
end
def dependencies
run
@dependencies
end
def manual_marked_packages
@manual_marked_packages ||= parse_cli_list(`apt-mark showmanual`)
end
private
def reverse_dependencies(package)
parse_cli_list(`apt-cache rdepends #{package}`)[2..-1]
end
def parse_cli_list(list)
list.split("\n").map(&:strip)
end
end
list = ListRootPackages.new
list.run
puts "===== Root Packages (#{list.root_packages.count}) ====="
puts list.root_packages.join("\n")
puts
puts "===== Children packages (#{list.dependencies.count}) ====="
puts list.dependencies.map { |package, parents| "#{package}: #{parents.join(', ')}" }.join("\n")
puts
puts "===== Potential cyclic dependencies (#{list.potential_cyclic_dependences.count}) ====="
puts list.potential_cyclic_dependences.join(", ")
si quelqu'un veut convertir cela en Bash ou en Python, ce serait bien puisque Ruby est installé moins souvent sur des serveurs que Bash ou Python.