¿apt-get paquetes de instalación masiva de un archivo?

36

Tengo un archivo de texto con muchos nombres de paquetes.

package1
package2

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

package 4

¿Cómo puedo instalar en masa todos los paquetes dentro del archivo de texto sin eliminar los comentarios?

James Mitch
fuente
Esta solución le permite usar comentarios: monolune.com/installing-apt-packages-from-a-requirements-file
Flux

Respuestas:

44

Algo en este sentido debería hacer el truco.

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

La construcción $ (algo) ejecuta el comando algo , insertando su salida en la línea de comando.

El comando grep excluirá cualquier línea que comience con un #, opcionalmente permitiendo espacios en blanco antes. Luego, el comando tr reemplaza las nuevas líneas con espacios.

andol
fuente
44
trfallará con las secuencias de fin de línea de varios bytes (piense \r\n), ¿por qué no lo usa xargs?
Ivan Anishchuk
11

El siguiente comando es una mejora (leve) sobre la alternativa porque sudo apt-get installno se ejecuta cuando la lista de paquetes está vacía.

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

Tenga en cuenta que la -aopción lee elementos directamente de un archivo en lugar de la entrada estándar. No queremos canalizar un archivo xargsporque stdin debe permanecer sin cambios para su uso apt-get.

Seis
fuente
xargses la forma correcta de hacer esto. Truco con <()es ordenado.
Ivan Anishchuk
1
De hecho, esa es la mejor solución porque xargsse asegura de ARG_MAX que no se alcance.
phk
Tiene que ser xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install, no " <(" sino " $(" y la opción -ypara apt-get sería una buena idea.
La sustitución de procesos redirige la salida awka un descriptor de archivo para xargs -aleer. Entonces definitivamente quieres <(y no $(. Solo pruébalo y verás lo que quiero decir. Si el comando se ejecuta sin supervisión y ya sabe exactamente lo que se va a instalar, entonces seguro, -ymarcar es una buena idea.
Seis
4

Dado un archivo de lista de paquetes package.list, intente:

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

Bueno, aquí está mi solución para instalar una lista de paquetes que tengo para una instalación nueva:

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

En una bashfunción:

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

grep explicación:

  • -o mantener solo la parte de la línea que coincide con la expresión
  • ^[^#] todo lo que no comienza con un #
  • [[:alnum]-]* una secuencia de letras, números y -
Biggybi
fuente