28

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). Commented 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. Commented 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. Commented Oct 28, 2012 at 5:11
  • 4
    I used pacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed Commented Jul 29, 2019 at 23:48
  • 3
    @stewSquared you should post that as an answer. Commented May 31, 2023 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. :) Commented Dec 8, 2014 at 18:35
4

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). Commented Jun 6, 2023 at 12:34
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? Commented 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. Commented 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 Commented Mar 2, 2016 at 2:18
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;
}
2

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

1

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.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.