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?

  • 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
  • 2
    I used pacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed Jul 29, 2019 at 23:48

7 Answers 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


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.

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

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 ; 
  • 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

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.

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;

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)


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).


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'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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