archlinux - 如何使用 pacman 搜尋取得軟體包的已安裝大小

archlinux - 如何使用 pacman 搜尋取得軟體包的已安裝大小

有時,當我想發現一個新軟體來使用時,我必須在多個軟體包之間進行比較。對我來說重要的因素之一是包裝尺寸,因為我經常傾向於使用輕型包裝來處理所有事情。

pacman -Ss命令非常有用,但我真的很想知道套件的大小,以便我可以進行比較。我嘗試過pacman -Ssi,但沒有成功。有什麼辦法可以在結果中添加一些資訊嗎pacman -Ss

我也嘗試過,pacman -Ss -p --print-format "%n: %s"但這也沒用。

答案1

您可以使用它pacman -Si來取得套件的安裝大小。所以這一切都變成了 awk 腳本的問題。

您可以定義以下函數並使用它。

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" 
}

如果你願意,你也可以這樣做:

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""}'
}

我剛剛發現有一種更簡單的方法!

pkgsize(){ expac -SsH M "%m: %n$\t%d" $@ | sort -h | tr '$' '\n'}

答案2

這是用 bash 編寫的另一個更明確的解決方案,用於收集套件大小,包括所有最小依賴項。

# 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"
}

本地測試

在我的機器上,Package::size konsole結果1973756405 bytes仍然感覺有點單一。另一方面,如果您想建立一個僅安裝 konsole 的自訂前衛發行版,那麼它的利基市場至少有大量框架潛力的支援。

關於資料庫同步的旁注

注意函數先查詢本地資料庫,失敗時再查詢遠端資料。因此,本地和遠端依賴項清單可能不同步,這很可能會傳回錯誤的結果。

Bash 變數作用域

我不認為 bash 是一個錯誤,但事實是局部變數在相關函數的子函數中是可見的。

相關內容