program story

사람이 읽을 수있는 형식의 파일 크기

inputbox 2020. 11. 29. 10:25
반응형

사람이 읽을 수있는 형식의 파일 크기


파일 크기 (바이트)가 주어지면 후행 0이있는 유효 숫자 3 개에 IEC (이진) 접두사사용하여 형식을 지정하고 싶습니다 . 예를 들어 1883954는 1.80M이됩니다.

bash에서는 부동 소수점 산술이 지원되지 않으므로 대신 awk를 사용했습니다. 문제는 후행 0을 유지하는 방법이 없다는 것입니다. 현재 솔루션 :

if [ $size -ge 1048576 ]
then
    size=$(awk 'BEGIN {printf "%.3g",'$size'/1048576}')M
elif [ $size -ge 1024 ]
then
    size=$(awk 'BEGIN {printf "%.3g",'$size'/1024}')K
fi

(파일이 그렇게 크지 않으므로 더 큰 단위를 고려할 필요가 없습니다.)

편집 : 이것에 또 다른 문제가 있습니다. 아래 Adrian Frühwirth의 의견을 참조하십시오.


GNU Coreutils 에는 numfmt숫자 변환을 위해 필요한 것으로 보이는 다소 알려지지 않은 도구가 포함되어 있습니다 .

$ numfmt --to=iec-i --suffix=B --format="%.3f" 4953205820
4.614GiB

나는 그것이 당신의 필요에 잘 맞고 다른 답변만큼 크거나 끔찍하지 않다고 생각합니다.

더 강력한 솔루션을 원한다면 다른 답변을보십시오.


사용하지 않는 이유가 있습니까?

ls -lh

명령? 지난 몇 년 동안 릴리스 된 Linux 시스템을 사용하는 경우이 기능이 있습니다.


ls -lah /path/to/your/file | awk -F " " {'print $5'}

조금 늦었다는 것을 알고 있습니다. 그러나 누군가가 유용하다고 생각할 수 있습니다.

대답은 간단하게 스크립트 %.2f대신 사용하는 것입니다 %.3g. ( src )


테스트:

#!/bin/bash

size=1883954

if [ $size -ge 1048576 ]
then
    size=$(awk 'BEGIN {printf "%.2f",'$size'/1048576}')M
elif [ $size -ge 1024 ]
then
    size=$(awk 'BEGIN {printf "%.2f",'$size'/1024}')K
fi

echo $size

출력 :

1.80M

사용해도 괜찮다 bc면 다음이 부동 소수점 연산을 수행하는 데 도움이 될 것입니다. scale인쇄하려는 많은 숫자에 따라 필요에 따라 변경할 수 있습니다.

size=1883954

if [ $size -ge 1048576 ]
then
    size=$(echo "scale=2;$size/1048576"| bc)M
elif [ $size -ge 1024 ]
then
    size=$(echo "scale=2;$size/1024" | bc)K
fi

echo $size

대신에 사용 ls하고 awk, 사용, 파일 크기를 얻을 stat -c %s filename.ext. 번호 만 출력하고 다른 것은 출력하지 않습니다 (적어도 버전 8.21에서는). numfmt십진수 정밀도로 printf 구문을 사용하지 않는 것으로 보이는 이전 버전이기 때문에 사용할 수 없습니다 . 대신 아래 스크립트를 사용합니다. 마지막 줄을 사용하여 스크립트가 제공되는지 테스트합니다. 그렇지 않은 경우 명령 줄에서 직접 호출 할 수 있습니다.

#!/bin/bash

function getFriendlyFileSize() {
    OUT='/dev/null'
    [ "$#" == 0 ] && echo 'No number given' && return 1
    [ ! $(echo $1 | egrep -i '\-?[0-9]+') ] && echo 'Garbage data' && return 1

    if [ "$1" == '' -o "$1" -lt 0 ] 2>$OUT
    then
            echo '0 B'
            return 1
    else
            FSIZE=$1
    fi

    [ "$2" == '' ] && DECPTS=1 || DECPTS=$2

    KB=1024
    MB=1048576
    GB=1073741824
    TB=1099511627776
    PB=1125899906842624
    EB=1152921504606846976
    LM=9223372036854775807 # bash comparison limit = 2^63-1 (signed int?)

    [ "$FSIZE" -le 0 ] 2>$OUT && echo "0 B" && return
    [ "$FSIZE" -lt $KB ] 2>$OUT && echo "$FSIZE B" && return
    [ "$FSIZE" -lt $MB ] 2>$OUT && echo "$(echo "scale=$DECPTS;$FSIZE/$KB"|bc) KB" && return
    [ "$FSIZE" -lt $GB ] 2>$OUT && echo "$(echo "scale=$DECPTS;$FSIZE/$MB"|bc) MB" && return
    [ "$FSIZE" -lt $TB ] 2>$OUT && echo "$(echo "scale=$DECPTS;$FSIZE/$GB"|bc) GB" && return
    [ "$FSIZE" -lt $PB ] 2>$OUT && echo "$(echo "scale=$DECPTS;$FSIZE/$TB"|bc) TB" && return
    [ "$FSIZE" -lt $EB ] 2>$OUT && echo "$(echo "scale=$DECPTS;$FSIZE/$PB"|bc) PB" && return
    [ "$FSIZE" -le $LM ] 2>$OUT && echo "$(echo "scale=$DECPTS;$FSIZE/$EB"|bc) EB" && return
    [ "$?" -ne '0' ] 2>$OUT && echo "Bad input" && return 1
}

[[ $_ == $0 ]] && getFriendlyFileSize $1 $2

Qalculate있다면! (그런데 굉장한), 쉬운 트릭이 있습니다.

human_readable="$( qalc -t set "precision $precision" "${in_bytes}B" )"

예:

$ qalc -t -set "precision 3" 5264334820B
5.26 GB

수식을 단순화하고 미지수를 풀고 더 많은 것을 해결할 수 있기 때문에 쉘 스크립팅에 매우 강력한 도구입니다.

$ qalc -t "e^(i*x)=-1"
x = 3.1415927

더 간단하고 덜 무거운 솔루션을 원한다면 다른 답변을 살펴보십시오.

참고URL : https://stackoverflow.com/questions/15854332/file-size-in-human-readable-format

반응형