사람이 읽을 수있는 형식의 파일 크기
파일 크기 (바이트)가 주어지면 후행 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
'program story' 카테고리의 다른 글
URL 매개 변수 값 가져 오기 (0) | 2020.11.29 |
---|---|
좋은 API 또는 나쁜 API를 어떻게 정의합니까? (0) | 2020.11.29 |
Swift의 UINavigationBar 텍스트 색상 (0) | 2020.11.29 |
오류 1067 (42000) : 'created_at'에 대한 잘못된 기본값 (0) | 2020.11.29 |
jQuery에서 문자열을 어떻게자를 수 있습니까? (0) | 2020.11.29 |