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


36

У мене є текстовий файл з великою кількістю імен пакетів.

package1
package2

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

package 4

Як я можу масово встановити всі пакунки всередині текстового файлу, не видаляючи коментарів?


Це рішення дозволяє використовувати коментарі: monolune.com/installing-apt-packages-from-a-requirements-file
Flux

Відповіді:


44

Щось за цими напрямками повинно зробити трюк.

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

Конструкція $ (щось) виконує команду щось , вставляючи свій вихід у командний рядок.

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


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)

0

Ну ось моє рішення встановити список пакунків, які я маю на свіжу установку:

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

У bashфункції:

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

grep пояснення:

  • -o зберігайте лише ту частину рядка, яка відповідає виразу
  • ^[^#] все, що не починається з а #
  • [[:alnum]-]* послідовність літер, цифр і -
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.