[pacman-dev] [PATCH] pacsysclean: Add new contrib script

Dan McGee dpmcgee at gmail.com
Wed Nov 16 00:04:34 EST 2011


On Tue, Oct 25, 2011 at 4:50 PM, Eric Bélanger <snowmaniscool at gmail.com> wrote:
> No. I was waiting for feedback for the new version that I appended at
> the end of my last email. Allan was supposed to give it a look but I
> guess he was too busy with the pacman 4 release like everyone else. If
> that version is OK, let me know and I'll resubmit an updated git
> patch.

Looked at this tonight. A few observations:

* We use 'KiB' instead of 'K' now, so the magic matching was busted
* running one `pacman -Qi` call and one awk invocation per package
really stinks and is very slow


A revised version is below that pipelines and reduces calls to all
programs involved. It takes 1.8 seconds now instead of a lot longer.
(you can make it go faster, 0.5 seconds total, if you add a single
grep call in the pipeline, but not too concerned at this point).

Dave, I hope you cry at my bash skillz.

-Dan


$ time bash pacsysclean.sh >/dev/null

real	0m1.862s
user	0m1.803s
sys	0m0.070s


#!/bin/bash

PACMAN_OPTS=

usage() {
	echo "pacsysclean - Sort installed packages by decreasing installed size."
	echo
	echo "Usage: pacsysclean [options]"
	echo
	echo "Options:"
	echo "  -o <options>     Specify custom pacman query options (e.g., -dt)"
	echo "  -h, --help       Show this help message and exit"
}


if [ -n "$1" ]; then
	case "$1" in
		-o) PACMAN_OPTS="${2}" ;;
		-h|--help) usage; exit 0 ;;
		*) usage; exit 1 ;;
	esac
fi

IFS=$'\n'
name="^Name.*: (.*)$"
size="^Installed Size.*: (.*) KiB$"
for line in $(LANG=C pacman -Qi $PACMAN_OPTS); do
	if [[ $line =~ $name ]]; then
		printf "%s\t" ${BASH_REMATCH[1]}
	elif [[ $line =~ $size ]]; then
		printf "%s\n" ${BASH_REMATCH[1]}
	fi
done | sort -g -k2 | awk '
BEGIN {
	split("KiB MiB GiB TiB PiB EiB ZiB YiB", suffix)
}
function format_size(size) {
	count = 1
	while (size + 0 > 1024) {
		size /= 1024
		count++
	}
	sizestr = sprintf("%.2f %s", size, suffix[count])
	return sizestr
}
{
	printf("%s\t%s\n", format_size($2), $1);
}'


More information about the pacman-dev mailing list