메모리 크기 단위의 값에 대한 산술

메모리 크기 단위의 값에 대한 산술

86k또는 320m또는 형식 으로 작성된 메모리 양을 나타내는 숫자 묶음이 있다고 가정해 보겠습니다 1.7g. 명령줄에서 합계를 계산하고 사람이 읽을 수 있는 결과를 반환하려면 어떻게 해야 합니까?

뺄셈도 할 수 있어서 좋네요. 여러 기호 집합(예: 1g/ 1G/ 1GB/ 1Go/ 1GiB/ 1.7Gio)과 그 의미(이진수 또는 십진수 승수)를 처리하는 완벽한 도구입니다.

나는 순수한 계산기를 찾고 있습니다. 이 숫자는 반드시 내 디스크에 있는 일부 파일의 크기가 아니므로 도구를 선택하거나 사용할 수 있는 find방법 이 없습니다 .statdu

이것은 분명히 구현하기 쉽지만(정확성에 약간의 장애물이 있음) 이것이 아직 존재하지 않는다면 저주받을 것입니다!

답변1

약간의 자기 홍보: 우리는 다음과 같은 라이브러리를 작성했습니다.라이브러리 바이트 크기C와 Python에서 이러한 계산을 수행하기 위해 다음과 같은 명령줄 도구도 있습니다.계산하다

$ bscalc "5 * (100 GiB + 80 MiB) + 2 * (300 GiB + 15 GiB + 800 MiB)"
1215425413120 B
1186938880.00 KiB
   1159120.00 MiB
      1131.95 GiB
         1.11 TiB

이 라이브러리는 대부분의 배포판에 패키지되어 있지만 안타깝게도 도구는 그렇지 않습니다. Fedora libbytesize-tools및 SuSE 패키지 에는 있지만 bscalcDebian/Ubuntu에는 없습니다.

답변2

가지다잉카.

$ bcal -m "(5kib+2mib)/2"
1051136 B
$ bcal -m "(5kb+2mb)/2"
1002500 B

-m플래그는 간단한 출력에 사용됩니다. 이를 제거하면 기본 2(KiB, MiB, GiB, TiB) 및 기본 10(kB, MB, GB, TB)의 자세한 결과가 출력됩니다.

이는 올바른 바이트 단위가 아니기 때문에 이해 하지 못합니다 86k. 이 경우 Sed를 사용하여 각 문자 뒤에 추가한 후 다음으로 파이프 할 수 있습니다 .320m1.7gbbcal

$ cat file
1.7g+320m+86k
$ sed 's/[gmk]/&b/g' file | bcal -m
bcal> 1.7gb+320mb+86kb
2020086000 B

대화형 모드에서도 사용할 수 있습니다.

답변3

다음 zsh과 같은 수학 함수를 정의할 수 있습니다.

() {
  typeset -gA bsuffix
  local n=1 ni=1 s
  for s (k m g t p e) {
    (( n *= 1000 )); (( ni *= 1024 ))
    (( bsuffix[$s] = bsuffix[${s}ib] = bsuffix[${s}io] = ni ))
    (( bsuffix[${s}b] = bsuffix[${s}o] = n ))
  }
}
b() {
  set -o localoptions -o extendedglob
  local s=${(M)1%(#i)(${(j:|:k)~bsuffix})}
  (( ${1%$s} * ${bsuffix[$s:l]-1} ))
}

functions -Ms b

b(1G)그런 다음 in , 등 또는 in 과 같은 zsh 산술 표현식에서 를 사용할 수 있습니다 .b(1mB)(( .... ))$(( ... ))$array[...]zcalc

$ <<< $((b(86k) + b(320mb) + b(1.7gio)))
2145449164.8

$ autoload zcalc
$ zcalc
1> b(86k) + b(320mb) + b(1.7gio)
2.14545e+09
2> :sci 15
2145449164.8

$ echo $(( b(infeo) ))
Inf   

답변4

명령줄에서 합계를 계산하고 사람이 읽을 수 있는 결과를 반환하려면 어떻게 해야 합니까?

Ksh는 부동 소수점 수학을 지원하므로 .kshrc에서 필요한 상수를 정의하고 수학 연산에 사용할 수 있습니다.

그리고 나서사람이 읽을 수 있는 결과printf내장 된 기능을 사용 %#d하거나%#i

printf [ -v varname ] format [ arg ... ]

...

  • ## 플래그는 %d출력 베이스가 없는 형식과 함께 사용되면 다음 접미사 중 하나로 표시되는 1000의 거듭제곱으로 출력을 표시합니다. k M G T P E이 형식과 함께 사용되면 다음 %i중 하나로 표시되는 1024의 거듭제곱으로 출력을 표시합니다. 다음 접미사: Ki Mi Gi Ti Pi Ei.

https://www.manpagez.com/man/1/ksh/

예를 들어

$ K=1024  M=$((K * K))  G=$((M * K))  T=$((G * K))  P=$((T * K))  E=$((P * K))
$ KB=1000 MB=$((KB*KB)) GB=$((MB*KB)) TB=$((GB*KB)) PB=$((TB*KB)) EB=$((PB*KB))

$ printf "%#i\n" $((12e+12 + 1.2e+9 + 12e+6))
11Ti
$ printf "%#d\n" $(((58*$K + 2*$M)/2))
1.1M
$ printf "%#d\n" $((5 * (100*$G + 80*$M) + 2 * (300*$G + 15*$G + 800*$M)))
1.2T
$ printf "%#d\n" $((1.7*$GB + 320*$MB + 86*$KB))
2.0G

관련 정보