archlinux - cómo obtener el tamaño instalado de los paquetes con pacman search

archlinux - cómo obtener el tamaño instalado de los paquetes con pacman search

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 -Sscomando es muy útil, pero también me encantaría tener el tamaño de los paquetes para poder comparar. Lo intenté pacman -Ssipero 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 -Sipara 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 konsolelos resultados 1973756405 bytestodaví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.

información relacionada