31

I have a text file with lots of package names.

package1
package2

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

package 4

How can I mass install all packages inside the text file without removing the comments?

41

Something along these lines ought to do the trick.

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

The $(something) construction runs the something command, inserting its output in the command line.

The grep command will exclude any line beginning with a #, optionally allowing for whitespace before it. Then the tr command replaces newlines with spaces.

  • 4
    tr will fail with multi-byte end-of-line sequences (think \r\n), why don't you use xargs? – Ivan Anishchuk Feb 17 '16 at 16:20
11

The following command is a (slight) improvement over the alternative because sudo apt-get install is not executed when the package list is empty.

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

Note that the -a option reads items directly from a file instead of standard input. We don't want to pipe a file into xargs because stdin must remain unchanged for use by apt-get.

  • xargs is the right way to do this. Trick with <() is neat. – Ivan Anishchuk Feb 17 '16 at 16:19
  • 1
    That's indeed the better solution because xargs makes sure ARG_MAX is not reached. – phk Jun 12 '16 at 11:45
  • It has to be xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install, not "<(" but "$(" and the option -y for apt-get would be a good idea. – user567188 Jul 11 '16 at 20:19
  • Process substitution redirects the output of awk into a file descriptor for xargs -a to read from. So you definitely want <( and not $(. Just try it and you'll see what I mean. If the command is to be running unattended and you already know exactly what's going to be installed then sure, they -y flag is a good idea. – Six Jul 12 '16 at 3:01
4

Given a package list file package.list, try:

sudo apt-get install $(awk '{print $1'} package.list)

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.