Automatically resolving and installing dependencies is one of the core features of package managers (and one of the most convenient). However, this can lead to packages being installed that have been pulled as a dependency for another package, but are no longer needed1. This can have slightly unfortunate side effects, such as crowding the upgrade dialog when a bunch of packages that are no longer needed receive updates in high frequency (looking at you, Haskell packages in Arch…).
To ease house cleaning, at least on distros using pacman, we can simply find these unneeded packages that used to be installed as a dependency via
This will list all unrequired packages that have been originally installed as a dependency instead of being specifically installed by the user.
We could either periodically run this by hand, or we can simply tell pacman to just do it for us regularly.
To do so, we create a new file
[Trigger] Operation = Install Operation = Upgrade Operation = Remove Type = Package Target = * [Action] Description = "Checking for unneeded packages" When = PostTransaction Exec = /usr/bin/pacman -Qtd
This will run
pacman -Qtd on every pacman-operation that can change our package state for every possible target package after all package transactions have been completed.
While this works, the output is not the most neatly arranged, so we can just modify our
Exec a little to make it more beautiful, either by calling a script that does that or simply by a semi-beautiful, but compact one-liner, changing our pacman-hook to
[Trigger] Operation = Install Operation = Upgrade Operation = Remove Type = Package Target = * [Action] Description = "Checking for unneeded packages" When = PostTransaction Exec = /usr/bin/bash -c "set -o pipefail && /usr/bin/pacman -Qtd | sed 's/^/ - /' || /usr/bin/echo ' :: No unneeded packages found.'"
This now neatly displays superfluous packages right after ever
pacman -Syu, so you can clean up right away if you really don’t need those packages anymore.
Cleaning up superfluous packages
The quickest way of removing superfluous packages (and all its dependencies, that are only needed by these packages) is by running
pacman -Rnsc $(pacman -Qdtq)2, which can be easily aliased to something like
pacclean, being readily available at your fingertips afterwards without much typing.
off-topic remark: dependency tracking
On the note of package dependencies: if you want to find out which package(s) pulled in a specific package,
pactree -r specific_package_name will give you insight into that.
This could happen for numerous reasons, for example because one removed the package needing it without telling the package manager to remove dependencies as well or that package simply dropped its dependency. ↩︎
Finding out what the single flags mean is left to the reader, if not known, the author highly recommends getting to know pacman’s tremendously helpful subcommand-helps, such as
pacman -Qh. ↩︎ ↩︎
The name of the file doesn’t matter, however, it must be located in the hooks-directory and end in
.hookfor pacman to read it. ↩︎