On Wed, Nov 16, 2011 at 12:04 AM, Dan McGee <dpmcgee@gmail.com> wrote:
On Tue, Oct 25, 2011 at 4:50 PM, Eric Bélanger <snowmaniscool@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
Yeah, I haven't looked at it since pacman 4 is out.
* running one `pacman -Qi` call and one awk invocation per package really stinks and is very slow
Thanks for fixing and improving it. There's only a minor change to do (see inline script) and the rest is fine with me. I noticed that you changed the sorting order but I could add an option for that later once it's pushed to master or maint. I'll wait a few days in case there are other people who wants to comment, then I'll submit that version in a proper git patch.
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)"
replace by: echo " -o <options> Specify custom pacman query options (e.g., dt)" as "pacsysclean -o -dt" doesn't work.
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); }'