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반면에 konsole만 설치된 사용자 정의 엣지 있는 배포판을 구축하려는 경우 틈새 시장은 최소한 많은 프레임워크 잠재력으로 뒷받침됩니다.

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

이 함수는 로컬 데이터베이스를 먼저 쿼리하고 실패 시 원격 데이터를 쿼리한다는 점에 유의하세요. 따라서 로컬 및 원격 종속성 목록이 동기화되지 않아 아마도 잘못된 결과가 반환될 가능성이 있습니다.

Bash 변수 범위

나는 bash를 전체적으로 버그라고 생각하지 않지만 관련 함수의 하위 함수 내에서 지역 변수가 표시된다는 사실을 고려합니다.

관련 정보