Archlinux - So ermitteln Sie die installierte Größe von Paketen mit der Pacman-Suche

Archlinux - So ermitteln Sie die installierte Größe von Paketen mit der Pacman-Suche

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 -SsBefehl 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 -Ssiaber 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 -Sium 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 konsoledas Ergebnis 1973756405 bytesimmer 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.

verwandte Informationen