On Tue, Oct 25, 2011 at 4:50 PM, Eric Bélanger <[email protected]> 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);
}'

Reply via email to