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

Dan McGee dpmcgee at gmail.com
Mon Aug 8 18:30:23 EDT 2011


On Sun, Aug 7, 2011 at 4:14 PM, Eric Bélanger <snowmaniscool at gmail.com> wrote:
> pacsysclean sort installed packages by decreasing installed size. It's
> useful for finding large unused package when doing system clean-up. This
> script is an improved version of other similar scripts posted on the
> forums. Thanks goes to Dave as I reused the size_to_human function from his
> paccache script.
>
> Signed-off-by: Eric Bélanger <snowmaniscool at gmail.com>
>
> ---
>
> If you can think of a better name, feel free to suggest one.
> ---
>  contrib/.gitignore     |    1 +
>  contrib/Makefile.am    |    5 ++-
>  contrib/pacsysclean.in |   87 ++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 92 insertions(+), 1 deletions(-)
>  create mode 100755 contrib/pacsysclean.in
>
> diff --git a/contrib/.gitignore b/contrib/.gitignore
> index 1bd145f..19b81e0 100644
> --- a/contrib/.gitignore
> +++ b/contrib/.gitignore
> @@ -6,5 +6,6 @@ paclist
>  paclog-pkglist
>  pacscripts
>  pacsearch
> +pacsysclean
>  wget-xdelta.sh
>  zsh_completion
> diff --git a/contrib/Makefile.am b/contrib/Makefile.am
> index 10b03a2..754096d 100644
> --- a/contrib/Makefile.am
> +++ b/contrib/Makefile.am
> @@ -5,7 +5,8 @@ OURSCRIPTS = \
>        paclist \
>        paclog-pkglist \
>        pacscripts \
> -       pacsearch
> +       pacsearch \
> +       pacsysclean
>
>  OURFILES = \
>        bash_completion \
> @@ -21,6 +22,7 @@ EXTRA_DIST = \
>        paclist.in \
>        pacscripts.in \
>        pacsearch.in \
> +       pacsysclean.in \
>        vimprojects \
>        zsh_completion.in \
>        README
> @@ -59,6 +61,7 @@ paclist: $(srcdir)/paclist.in
>  paclog-pkglist: $(srcdir)/paclog-pkglist.in
>  pacscripts: $(srcdir)/pacscripts.in
>  pacsearch: $(srcdir)/pacsearch.in
> +pacsysclean: $(srcdir)/pacsysclean.in
>  pactree: $(srcdir)/pactree.in
>  zsh_completion: $(srcdir)/zsh_completion.in
>
> diff --git a/contrib/pacsysclean.in b/contrib/pacsysclean.in
> new file mode 100755
> index 0000000..e393e24
> --- /dev/null
> +++ b/contrib/pacsysclean.in
> @@ -0,0 +1,87 @@
> +#!/bin/bash
> +
> +# pacsysclean - Sort installed packages by decreasing installed size. Useful for system clean-up.
> +#
> +# Copyright (C) 2011 Eric Bélanger <eric at archlinux.org>
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License
> +# as published by the Free Software Foundation; either version 2
> +# of the License, or (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +
cut from here
> +export TEXTDOMAIN='pacman'
> +export TEXTDOMAINDIR='/usr/share/locale'
> +
> +# determine whether we have gettext; make it a no-op if we do not
> +if ! type gettext &>/dev/null; then
> +       gettext() {
> +               echo "$@"
> +       }
> +fi
to here. You aren't using gettext() and we don't support it in contrib anyway.

> +
> +usage() {
> +       echo "$0 - Sort installed packages by decreasing installed size."
> +       echo
> +       echo "Usage: $0 [options]"
> +       echo
> +       echo "Options:"
> +       echo "  -a               List all packages (Default)"
> +       echo "  -e               List unrequired explicitely installed packages"
spelling, explicitly. Slightly related is using "not required" in the
description as unrequired is not really a word (but it makes sense as
a one-word flag, just not as a definition).

Wouldn't it make more sense to allow any options pacman -Q allows on
filtering, rather than just trying to emulate 1? I can see people
wanting to do -Qdt, Qet, -Qm, etc.

> +       echo "  -h, --help       Show this help message and exit"
> +}
> +
> +size_to_human() {
> +       awk -v size="$1" '
> +       BEGIN {
> +               suffix[1] = "KiB"
> +               suffix[2] = "MiB"
> +               suffix[3] = "GiB"
> +               suffix[4] = "TiB"
> +               count = 1
> +
> +               while (size > 1024) {
> +                       size /= 1024
> +                       count++
> +               }
> +
> +               sizestr = sprintf("%.2f", size)
> +               sub(/.?0+$/, "", sizestr)
> +               printf("%s %s", sizestr, suffix[count])
> +       }'
Isn't this fairly expensive to invoke awk each time you call it? This
seems bash-math-able. It also already differs from Dave's
implementation as he added the low 'B' suffix, and neither of these
have the 'PiB' suffix that our formatter in pacman has.

> +}
> +
> +PACMAN_OPTS="-Qq"
> +if [ -n "$1" ]; then
> +       case "$1" in
> +               -a) PACMAN_OPTS="-Qq" ;;
> +               -e) PACMAN_OPTS="-Qetq" ;;
> +               -h|--help) usage; exit 0 ;;
> +               *) usage; exit 1 ;;
> +       esac
> +fi
> +
> +TEMPDIR=$(mktemp -d /tmp/cleanup-script.XXXX)
> +cd $TEMPDIR
> +
> +# Sort installed packages by decreasing installed size. Useful for system clean-up.
> +for package in $(pacman $PACMAN_OPTS); do
> +       echo $(pacman -Qi $package |grep 'Installed Size' |awk '{print $4}') $package
I believe $(pacman -Qiet) would work just fine, right? And save you
several invocations of commands making this a lot more efficient, as
long as you properly navigate the output.

This also won't work as written if you are in a different locale; I
highly recommend testing every pacman script by enabling zh_CN.UTF-8
in /etc/locale.gen, regenerating locales, and then executing via
'LANG=zh_CN.UTF-8 ./my_awesome_script.sh".

> +done | sort -g -r -o raw.txt
> +
> +N=0
> +while read LINE ; do
> +       N=$((N+1))
> +       size_to_human $(echo -n $LINE |cut -d' ' -f1) >> sorted-list.txt
> +       echo -n ' : ' >> sorted-list.txt
> +       echo -n $LINE |cut -d' ' -f2 >> sorted-list.txt
> +done < raw.txt
> +
> +echo "Files saved to $TEMPDIR"
> --
> 1.7.6


More information about the pacman-dev mailing list