У меня есть текстовый файл с множеством имен пакетов.
package1
package2
# comment
# installing package3 because it was needed for...
package 3
package 4
Как можно массово установить все пакеты внутри текстового файла, не удаляя комментарии?
Учитывая файл списка пакетов package.list
, попробуйте:
sudo apt-get install $(awk '{print $1'} package.list)
Что-то в этом роде должно сработать.
apt-get install $(grep -vE "^\s*#" filename | tr "\n" " ")
Конструкция $ (что-то) запускает команду кое-что , вставляя ее вывод в командную строку.
Команда grep исключит любую строку, начинающуюся с #, опционально допуская пробелы перед ней. Затем команда tr заменяет символы новой строки пробелами.
Следующая команда является (небольшим) улучшением по сравнению с альтернативой, потому что sudo apt-get install
не выполняется, когда список пакетов пуст.
xargs -a <(awk '! /^ *(#|$)/' "$packagelist") -r -- sudo apt-get install
Обратите внимание, что опция -a
считывает элементы непосредственно из файла вместо стандартного ввода. Мы не хотим передавать файл в xargs
, потому что stdin должен оставаться неизменным для использования apt-get
.
Ну, вот мое решение установить список пакетов, которые я имею для новой установки:
sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "filename")
В a bash
функция:
aptif () {
sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "$1")
}
grep
объяснение:
-o
сохраните только часть строки, которая соответствует выражению^[^#]
что-либо, что не запускается с a #
[[:alnum]-]*
последовательность букв, чисел и -
Я использую это простое решение:
grep -vE '^#' file.txt | xargs sudo apt install -y
grep
находит все строки, которые не начинаются с #
, и передает их в качестве аргументов sudo apt install
.