Tasked with cleaning up an installation script, I noticed it was calling dpkg dozens of times to verify that the required packages were in place. On a Raspberry Pi, or similar low powered device, this takes ages. I replaced it with the following:
c=0 while read -r pkg; do printf 'Missing package: %s\n' "$pkg" >&2 (( ++c )) done < <(dpkg-query -W -f='${binary:Package}\n' | cut -d ':' -f 1 | sort | comm -13 - <(sort <<-EOF libc-ares2 libssl1.0.0 zliblg mosquitto gdb tcpdump vim EOF )) printf 'Total missing packages: %d\n' "$c" >&2
In short:
- We query dpkg once, listing every installed package, cut off any version numbers and sort the list
- We sort a list of manually specified required packages (libc-ares2 … vim)
- We compare the sorted lists (sorting is a requirement for comm), specifying that we want to not display columns 1 and 3, which are lines unique to the left side (installed ones), and lines that appear on both sides (installed and required), respectively. This leaves colum 2, the ones unique to the right side, which are the required packages missing from dpkg’s list.
Sample output:
$ ./check Missing package: gdb Missing package: mosquitto Missing package: zliblg Total missing packages: 3
Archived here for future reference, and in case it’s useful to anyone 🙂