blob: ed48407252d34b77a987eb064b0d1d3e3e42d6dc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#!/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"
|