27

I'm using arch linux.

Is there a way to list optional dependencies of all installed packages? And if yes, can I filter this list to see only the missing (not installed) packages?

5
  • 1
    I haven't used Arch, but "dependency" doesn't sound optional (it's not in other distros).
    – jordanm
    Oct 28, 2012 at 4:27
  • AFAIK, I don't think you can do that with pacman straight away. But it is very possible to write a small script to do it. Query pacman for list of installed packages. Have Yaourt fetch their PKGBUILDs and read the list of optdeps. The latest version of pacman-git has a commit that states whether the optdeps have already been installed.
    – darnir
    Oct 28, 2012 at 5:09
  • @jordanm: As has build dependencies and optional dependencies. Optdeps are required only for certain features of a package. So, unless you are using that feature, you don't really need to bloat your system with a load of dependencies.
    – darnir
    Oct 28, 2012 at 5:11
  • 3
    I used pacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed Jul 29, 2019 at 23:48
  • 2
    @stewSquared you should post that as an answer. May 31 at 2:01

8 Answers 8

7

There is a nice utility in the AUR-Repository (aur/pacdep).

pacdep has a lot of options - just one example - find out optional packages for "thunar-archive-plugin":

> pacdep -oppp thunar-archive-plugin
[...]
Optional dependencies:    6.16 MiB
  extra/file-roller     3.89 MiB
  extra/kdeutils-ark    1.12 MiB
  community/xarchiver   1.16 MiB
[...]

The output above means that none of the optional packages are installed. After installing "xarchiver" the output looks like

[...]
Optional dependencies:    6.16 MiB
 local:    1.16 MiB
  xarchiver            1.16 MiB
 sync:     5.01 MiB
  extra/file-roller    3.89 MiB
  extra/kdeutils-ark   1.12 MiB
[...]

I found (the first part of) this answer on
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies

5

You can use expac to query alpm data (pacman database).

Something like:

awk 'NF>=2' <(expac "%n %O") > optdeps

will print a list of all the installed packages on your machine, and the optdepends for each, to a file called optdeps. You could then sort this against a list of installed optdepends packages.

See man expac for the complete list of options.

1
  • [poke] We do have such a font now. :)
    – muru
    Dec 8, 2014 at 18:35
3

This is not exactly efficient, but will find what you want (in COLOR!):

pacman -Q > /tmp/paccache
for pkg in $(awk '{print $1}' /tmp/paccache) ; do 
   echo -n "$pkg => "; 
   for dep in $(pacman -Qi $pkg | awk -F: '/Optional Deps/{gsub(/[\<\>=].*/,"");print $NF;}' ) ; do 
       grep -q "$dep" /tmp/paccache && COLOR=32 ; echo -en "\e[1;${COLOR:-31}m${dep}\e[0;m " ; unset COLOR ; 
   done 
   echo
done 
3
  • I'm not perfectly sure, but shouldn't that be || instead of && after the grep, and then parentheses around the rest of the line?
    – Rörd
    Nov 20, 2012 at 21:10
  • And more importantly, this should probably use the "Optional Deps" section instead of the "Depends On" section of the pacman output.
    – Rörd
    Nov 20, 2012 at 22:28
  • For example with xmms2: pacman -Qi xmms2 | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1 | cut -c19- | cut -d: -f1
    – i336_
    Mar 2, 2016 at 2:18
3

This should do the trick:

comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)

First input to comm lists all optional dependencies, second input all installed packages and their 'provide' attributes. Both lists are sorted and contain each element only once due to sort -u. Then only lines are shown that are contained in the first but not in the second list.

(edited to incorporate @Archemar's suggestion)

1
  • By far the cleanest solution! Just note for readers that it does require installing a separare tool (expac). Jun 6 at 12:34
2

Though I've had to notice that @DarkHeart's solution doesn't really work, it inspired me to make a working one. (no colours, though)

I'm using package-query, a similar tool instead of expac which was suggested by @jasonwryan, because I've had it already installed (it's a dependency of yaourt). It should be trivial to change this to use expac instead.

The listing of all optional dependencies is mostly done by the call to package-query. The first for-loop removes the explanations, so just the package names for the optional dependencies remain; the second for-loop removes the already installed dependencies in its first line before printing the results in the second one.

#!/usr/bin/perl
use strict;
use warnings;

my %deps;
for (`package-query -Q -f'%n %O'`) {
    $deps{ (/^(\S+)/)[0] } = [/(\S+):/g];
}
my @pkgs = keys %deps;
for my $pkg (@pkgs) {
    my @missing_deps = grep { !($_ ~~ @pkgs) } @{ $deps{$pkg} };
    print "$pkg => @missing_deps\n" if @missing_deps;
}
1

I tried only in GNU sed but

yay -Qi | sed -n '/Optional Deps/{:l s/.* \([a-zA-Z0-9.\-]\+\):.*/\1/p; n; /Required By/!bl}'

this worked(Use sort/uniq as you like).

0

Sometimes you have to work backwards... first find all non-optional depends, then cross-reference with full list, then use uniq. This will generate a list of installed optional depends.

Find all installed

pacman -Q

Find all non-optional:

pacman -Qent

Unique entries must therefore be optional:

(pacman -Q; pacman -Qent) | sort | uniq -u 

Generate list of missing optional depends with descriptions, not pretty, but it works.

pacman -Q > /tmp/paccache; for pkg in $(awk '{print $1}' /tmp/paccache); do pacman -Qi $pkg | grep "^Optional Deps" | grep -v None >/dev/null && echo $pkg >> /tmp/hasdeps; done

for pkg in $(awk '{print $1}' /tmp/hasdeps); do echo -ne "Package: $pkg ___ "; (pacman -Qi $pkg | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1) | grep -v installed; echo ___; done | grep -v "___ ___" | sed -e 's/Optional Deps/ /' -e 's/___//' | sed -e 's/ \+/ /g'
0
0

For optional dependencies:

pacman --sync --info [PACKAGE] | grep --extended-regex "^Optional Deps|^                  " | sed -e "s|Optional Deps   : ||" -e "s|                  ||" | cut --delimiter=':' --fields=1 | sed "s|  |\n|g"

For both required and optional dependencies:

pacman --sync --info [PACKAGE] | grep --extended-regex "^Depends On|^Optional Deps|^                  " | sed -e "s|Depends On      : ||" -e "s|Optional Deps   : ||" -e "s|                  ||" | cut --delimiter=':' --fields=1 | sed "s|  |\n|g" | sort

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .