apt-get массовая установка пакетов из файла?

36

У меня есть текстовый файл с большим количеством имен пакетов.

package1
package2

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

package 4

Как я могу массово установить все пакеты внутри текстового файла, не удаляя комментарии?

Джеймс Митч
источник
Это решение позволяет использовать комментарии: monolune.com/install-apt-packages-from-a-requirements-file
Flux

Ответы:

44

Что-то в этом роде должно сработать.

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

Конструкция $ (то) запускает что - то команду, вставляя свой вывод в командной строке.

Команда grep исключит любую строку, начинающуюся с #, опционально допуская пробелы перед ней. Затем команда tr заменяет символы новой строки пробелами.

andol
источник
4
trпотерпит неудачу с многобайтовыми последовательностями конца строки (подумайте \r\n), почему бы вам не использовать xargs?
Иван Анищук
11

Следующая команда является (незначительным) улучшением по сравнению с альтернативой, потому что sudo apt-get installне выполняется, когда список пакетов пуст.

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

Обратите внимание, что -aопция читает элементы непосредственно из файла вместо стандартного ввода. Мы не хотим передавать файл, xargsпотому что stdin должен оставаться неизменным для использования apt-get.

Шесть
источник
xargsэто правильный способ сделать это. Трюк с <()опрятным.
Иван Анищук
1
Это действительно лучшее решение, потому xargsчто ARG_MAX оно не достигнуто.
phk
Должно быть xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install, не " <(", но " $(", и вариант -yдля apt-get был бы хорошей идеей.
Подстановка процесса перенаправляет вывод awkв дескриптор файла для xargs -aчтения. Так вы точно <(и не хотите $(. Просто попробуйте, и вы поймете, что я имею в виду. Если команда должна выполняться без присмотра, и вы уже точно знаете, что будет установлено, убедитесь, что они -yпомечены как хорошая идея.
шесть
4

Учитывая файл списка пакетов package.list, попробуйте:

sudo apt-get install $(awk '{print $1'} package.list)
cmcginty
источник
0

Итак, вот мое решение установить список пакетов, которые у меня есть для новой установки:

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

В bashфункции:

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

grep объяснение:

  • -o оставить только ту часть строки, которая соответствует выражению
  • ^[^#] все, что не начинается с #
  • [[:alnum]-]* последовательность букв, цифр и -
Biggybi
источник