
A veces, cuando quiero descubrir un nuevo software para usar, tengo que comparar varios paquetes. Uno de los factores importantes para mí es el tamaño del paquete, ya que suelo utilizar paquetes ligeros para todo.
El pacman -Ss
comando es muy útil, pero también me encantaría tener el tamaño de los paquetes para poder comparar. Lo intenté pacman -Ssi
pero no funciona. ¿Hay alguna forma de agregar información al resultado de pacman -Ss
?
También lo intenté pacman -Ss -p --print-format "%n: %s"
pero tampoco funcionó.
Respuesta1
Puede utilizar pacman -Si
para obtener el tamaño instalado de un paquete. Entonces todo se convierte en una cuestión de secuencias de comandos extrañas.
Puede definir la siguiente función y utilizarla.
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"
}
También puedes hacerlo así si quieres:
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""}'
}
¡Acabo de descubrir que hay un enfoque mucho más sencillo!
pkgsize(){ expac -SsH M "%m: %n$\t%d" $@ | sort -h | tr '$' '\n'}
Respuesta2
Aquí hay otra solución más explícita escrita en bash para recopilar tamaños de paquetes, incluidas todas las dependencias mínimas.
# 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"
}
Pruebas locales
En mi máquina Package::size konsole
los resultados 1973756405 bytes
todavía se sienten un poco monolíticos. Por otro lado, si desea crear una distribución vanguardista personalizada con solo la consola instalada, su nicho al menos está respaldado con un gran potencial de marco.
Nota al margen sobre la sincronización de bases de datos
Tenga en cuenta que esta función consulta primero la base de datos local y consulta los datos remotos en caso de falla. Por lo tanto, es posible que las listas de dependencias locales y remotas no estén sincronizadas, lo que probablemente arrojará resultados incorrectos.
Ámbitos variables de Bash
No considero que bash sea un error en su conjunto, pero sí el hecho de que las variables locales sean visibles dentro de las funciones secundarias de la función relativa.