Archlinux - 팩맨 검색을 사용하여 설치된 패키지 크기를 얻는 방법

Archlinux - 팩맨 검색을 사용하여 설치된 패키지 크기를 얻는 방법

때로는 사용할 새로운 소프트웨어를 찾고 싶을 때 여러 소프트웨어 패키지를 비교해야 합니다. 나에게 중요한 요소 중 하나는 팩 크기입니다. 저는 종종 모든 것에 경량 팩을 사용하는 경향이 있기 때문입니다.

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여전히 약간 1차원적으로 느껴집니다. 반면에 konsole만 설치하는 사용자 정의 프로그램 배포판을 구축하려는 경우 해당 틈새시장은 적어도 많은 프레임워크 잠재력으로 뒷받침됩니다.

데이터베이스 동기화에 대한 참고 사항

이 함수는 먼저 로컬 데이터베이스를 쿼리한 다음 실패할 경우 원격 데이터를 쿼리합니다. 따라서 로컬 및 원격 종속성 목록이 동기화되지 않을 수 있으며 이로 인해 잘못된 결과가 반환될 가능성이 높습니다.

Bash 변수 범위

나는 그것이 bash의 버그라고 생각하지 않지만 사실은 관련 함수의 하위 함수에 로컬 변수가 표시된다는 것입니다.

관련 정보