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?
Respuestas:
Algo en este sentido debería hacer el truco.
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.
fuente
tr
fallará con las secuencias de fin de línea de varios bytes (piense\r\n
), ¿por qué no lo usaxargs
?El siguiente comando es una mejora (leve) sobre la alternativa porque
sudo apt-get install
no se ejecuta cuando la lista de paquetes está vacía.Tenga en cuenta que la
-a
opción lee elementos directamente de un archivo en lugar de la entrada estándar. No queremos canalizar un archivoxargs
porque stdin debe permanecer sin cambios para su usoapt-get
.fuente
xargs
es la forma correcta de hacer esto. Truco con<()
es ordenado.xargs
se asegura deARG_MAX
que no se alcance.xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install
, no "<(
" sino "$(
" y la opción-y
para apt-get sería una buena idea.awk
a un descriptor de archivo paraxargs -a
leer. 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,-y
marcar es una buena idea.Dado un archivo de lista de paquetes
package.list
, intente:fuente
Bueno, aquí está mi solución para instalar una lista de paquetes que tengo para una instalación nueva:
En una
bash
función: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-
fuente