apt-get installer en masse des paquets à partir d'un fichier?

36

J'ai un fichier texte avec beaucoup de noms de paquets.

package1
package2

# comment
# installing package3 because it was needed for...
package 3

package 4

Comment puis-je installer en masse tous les packages dans le fichier texte sans supprimer les commentaires?

James Mitch
la source
Cette solution vous permet d'utiliser les commentaires: monolune.com/installing-apt-packages-from-a-requirements-file
Flux

Réponses:

44

Quelque chose dans ce sens devrait faire l'affaire.

apt-get install $(grep -vE "^\s*#" filename  | tr "\n" " ")

La construction $ (quelque chose) exécute la commande quelque chose , insérant sa sortie dans la ligne de commande.

La commande grep exclura toute ligne commençant par #, en laissant éventuellement un espace avant. Ensuite, la commande tr remplace les nouvelles lignes par des espaces.

andol
la source
4
tréchouera avec les séquences de fin de ligne multi-octets (pensez-vous \r\n), pourquoi ne pas utiliser xargs?
Ivan Anishchuk
11

La commande suivante constitue une (légère) amélioration par rapport à l’alternative car elle sudo apt-get installn’est pas exécutée lorsque la liste de packages est vide.

xargs -a <(awk '! /^ *(#|$)/' "$packagelist") -r -- sudo apt-get install

Notez que l' -aoption lit les éléments directement à partir d'un fichier au lieu d'une entrée standard. Nous ne voulons pas diriger un fichier dans xargsparce que stdin doit rester inchangé pour pouvoir être utilisé par apt-get.

Six
la source
xargsest la bonne façon de faire cela. Trick with <()is neat.
Ivan Anishchuk
1
C'est en effet la meilleure solution car xargss'assure que ARG_MAX n'est pas atteint.
phk
Ce doit être xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install, pas " <(" mais " $(" et l'option -ypour apt-get serait une bonne idée.
La substitution de processus redirige la sortie de awkdans un descripteur de fichier xargs -aà lire. Donc, vous voulez vraiment <(et pas $(. Essayez-le et vous verrez ce que je veux dire. Si la commande doit être exécutée sans surveillance et que vous savez déjà exactement ce qui va être installé, alors ils -ysont corrects.
Six
4

Étant donné un fichier de liste de paquets package.list, essayez:

sudo apt-get install $(awk '{print $1'} package.list)
cmcginty
la source
0

Eh bien, voici ma solution pour installer une liste de paquets que j'ai pour la nouvelle installation:

sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "filename")

Dans une bashfonction:

aptif () {
    sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "$1")
}

grep explication:

  • -o conserve uniquement la partie de la ligne qui correspond à l'expression
  • ^[^#] tout ce qui ne commence pas par un #
  • [[:alnum]-]* une séquence de lettres, chiffres et -
Biggybi
la source