#!/bin/sh -ef # Show the size on disk for a package ## SYNOPSIS: ## .Nm ## .Op Fl s ## .Op Ar pkg... ## DESCRIPTION: ## .Nm ## calculates the sizes of given ## .Ar packages ## using the files from the package manifest and outputs a total size of the ## packages along with all the files associated with them. If no arguments have ## been given, ## .Nm ## will use the name of the current directory as an argument. ## .Pp ## If the ## .Fl s ## flag is given, ## .Nm ## will sort the files by size. parser_definition() { setup REST help:usage -- "usage: ${0##*/} [-s] [pkg...]" flag sort -s hidden:1 disp :usage -h --help hidden:1 } # shellcheck source=../src/cpt-lib # shellcheck disable=1091 . cpt-lib # Use the current directory if no arguments have been given. [ "$1" ] || set -- "${PWD##*/}" # Ensure that all the packages given as arguments are installed. pkg_list "$@" >/dev/null mkdir -p "$tmp_dir" # We don't immediately pipe into awk as we want to exit in an error. for pkg; do sed '/\/$/d;s/./\\&/g' "$sys_db/$pkg/manifest"; done | xargs du -k > "$tmp_dir/size" # Do a numerical sort on the file if requested. [ "$sort" ] && sort -no "$tmp_dir/size" "$tmp_dir/size" # This awk function formats the `du` output similar to the '-hc' flags. We # could have used a shell `while read` loop to do the exact same thing, but that # would be much much slower. awk 'function fmtsize(s) { if (s==0) f="" else if (s<1024) f="K" else if (s<(1048576)){f="M";s=s/1024;} else if (s<(1073741824)){f="G";s=s/1048576;} else f="" return int(s) f } { sc = $1 size += $1 sub(sprintf("^%s\s*", $1), "") printf("%-6s %s\n", fmtsize(sc), $0) } END { printf("%-6s total\n", fmtsize(size)) }' "$tmp_dir/size"