Wenn ich eine neue Software entdecken möchte, muss ich manchmal mehrere Pakete vergleichen. Einer der wichtigsten Faktoren für mich ist die Paketgröße, da ich oft dazu neige, für alles leichte Pakete zu verwenden.
Der pacman -Ss
Befehl ist sehr nützlich, aber ich hätte wirklich gerne auch die Größe der Pakete, damit ich vergleichen kann. Ich habe es versucht, pacman -Ssi
aber es funktioniert nicht. Gibt es eine Möglichkeit, dem Ergebnis einige Informationen hinzuzufügen pacman -Ss
?
Ich habe es auch versucht pacman -Ss -p --print-format "%n: %s"
, aber das hat auch nicht funktioniert.
Antwort1
Sie können verwenden, pacman -Si
um die installierte Größe eines Pakets abzurufen. Es wird also alles zu einer Frage des Awk-Skriptings.
Sie können die folgende Funktion definieren und verwenden.
pkgsize(){
pacman -Ss $@ | awk '{if(NR%2) {system("pacman -Si "$1" | grep Ins | cut -d\":\" -f 2 | tr -d \" \n\" "" "); printf " "$1"$";} else print $0}' | sort -h | tr "$" "\n"
}
Wenn Sie möchten, können Sie es auch folgendermaßen machen:
pkgsize(){
pacman -Ss video edit | awk 'NR%2 { while("pacman -Si "$1 | getline line) if (line ~ /Ins/) { split(line,a,/:/);printf a[2] };print $1""}'
}
Ich habe gerade entdeckt, dass es einen viel einfacheren Ansatz gibt!
pkgsize(){ expac -SsH M "%m: %n$\t%d" $@ | sort -h | tr '$' '\n'}
Antwort2
Hier ist eine weitere, explizitere Lösung, die in Bash geschrieben wurde, um Paketgrößen einschließlich aller Mindestabhängigkeiten zu erfassen.
# bc compatible math form
# ex. 10KiB + 9MiB => 10*kib + 9*mib
function math () {
printf '%s\n' "$@" \
| sed -E 's/(([0-9]+)[[:space:]]*([a-zA-Z]+))/\2*\3/g' \
| sed -E 's,[^a-zA-Z0-9+*/. -]+,,g' \
| tr '[:upper:]' '[:lower:]' || true
}
# bc wrapper with optional SCALE env to round up
function calc () {
[ -z "$1" ] \
&& echo 0 \
&& return 0
local scale=""
local result=
local form="$(math "$@")"
{ [ -z "$form" ] \
|| [[ "$form" =~ ^[+*/-].*$ ]]; } \
&& local form="0$form"
if [[ "$SCALE" =~ ^[0-9]{1}$ ]]; then
local script="scale=$SCALE;x=((10^$SCALE)*($form)+0.5)/(10^$SCALE); print x"
printf "%.${SCALE}f" "$(bc -l <<EOF
$CALC_VARS
$script
EOF
)"
else
local script="x=($form); print x"
bc -l <<EOF
$CALC_VARS
$script
EOF
fi
}
# calc wrapper to pass byte relevant units
function bytecalc () {
CALC_VARS="s=512
kib=1024
mib=1024*kib
gib=1024*mib
tib=1024*gib
kb=1000
mb=1000*kb
gb=1000*mb
tb=1000*gb" calc "$@"
}
function Package::size () {
[ -z "$SEEN" ] \
&& local SEEN=`mktemp` \
&& local cleanup=${#FUNCNAME[@]}
local sum=0
for pkg in "$@"; do
cat "$SEEN" | grep -qE "^$pkg$" \
&& continue
local info=`pacman -Qi "$pkg" 2>/dev/null || pacman -Si "$pkg"`
local size=`grep "Installed Size" <<<"$info" \
| cut -d: -f2 | xargs \
| tr , . || true`
local -a deps=(`grep "Depends On" <<<"$info" \
| cut -d: -f2 \
| grep -oE "($| )[a-z][a-z0-9_.-]*" || true`)
echo "$pkg" >>"$SEEN"
test "${#deps[@]}" -gt 0 \
&& echo "lookup deps for '$pkg': ${deps[@]}" >&2 \
&& local depsize=$(Package::size "${deps[@]}" || true) \
|| local depsize=0
sum=$(SCALE=0 bytecalc "${sum:-0} + ${size:-0} + ${depsize:-0}")
done
test ${cleanup} -eq ${#FUNCNAME[@]} && rm "$SEEN"
echo "$sum"
}
Lokale Tests
Auf meiner Maschine fühlt sich Package::size konsole
das Ergebnis 1973756405 bytes
immer noch ein wenig monolithisch an. Wenn Sie andererseits eine benutzerdefinierte, ausgefallene Distribution erstellen möchten, auf der nur Konsole installiert ist, ist ihre Nische zumindest mit viel Framework-Potenzial ausgestattet.
Randbemerkung zur Datenbanksynchronisierung
Beachten Sie, dass diese Funktion zuerst die lokale Datenbank abfragt und bei einem Fehler die Remote-Daten abfragt. Daher ist es möglich, dass lokale und Remote-Abhängigkeitslisten nicht synchron sind, was höchstwahrscheinlich zu falschen Ergebnissen führt.
Bash-Variablenbereiche
Ich halte Bash als Ganzes nicht für einen Fehler, aber die Tatsache, dass lokale Variablen innerhalb der untergeordneten Funktionen der betreffenden Funktion sichtbar sind, halte ich für einen Fehler.