86k
또는 320m
또는 형식 으로 작성된 메모리 양을 나타내는 숫자 묶음이 있다고 가정해 보겠습니다 1.7g
. 명령줄에서 합계를 계산하고 사람이 읽을 수 있는 결과를 반환하려면 어떻게 해야 합니까?
뺄셈도 할 수 있어서 좋네요. 여러 기호 집합(예: 1g
/ 1G
/ 1GB
/ 1Go
/ 1GiB
/ 1.7Gio
)과 그 의미(이진수 또는 십진수 승수)를 처리하는 완벽한 도구입니다.
나는 순수한 계산기를 찾고 있습니다. 이 숫자는 반드시 내 디스크에 있는 일부 파일의 크기가 아니므로 도구를 선택하거나 사용할 수 있는 find
방법 이 없습니다 .stat
du
이것은 분명히 구현하기 쉽지만(정확성에 약간의 장애물이 있음) 이것이 아직 존재하지 않는다면 저주받을 것입니다!
답변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 패키지 에는 있지만 bscalc
Debian/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를 사용하여 각 문자 뒤에 추가한 후 다음으로 파이프 할 수 있습니다 .320m
1.7g
b
bcal
$ 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
.
예를 들어
$ 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