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