인간 친화적인 파일 크기를 변수에 저장하는 방법은 무엇입니까?

인간 친화적인 파일 크기를 변수에 저장하는 방법은 무엇입니까?

기본적으로 내가 원하는 것은 크기가 임계값(내 경우에는 2.2GB)을 초과하는 디렉터리의 모든 파일을 크기와 함께 출력하는 스크립트를 만드는 것입니다. 다음과 같이 stat 명령을 사용해 보았습니다.

a=$(stat -c '%s' example.txt)

그러나 이것은 파일 크기를 바이트 단위로 저장합니다. 내가 원하는 것은 사람이 읽을 수 있는 형식(MB, GB)으로 크기를 저장하고 표시하는 것입니다. 출력물을 저장 ls -lah한 후 이름과 크기만 저장되도록 결과를 다듬는 것도 고려했지만 이 작업이 지루한 작업인 것 같습니다. 결과를 바이트 단위로 저장한 다음 이에 대해 산술을 수행하는 것 외에 다른 방법이 있습니까?

답변1

이미 GNU 도구를 사용하고 있으므로 numfmtGNU coreutils를 참조하세요.

$ stat -c %s file
310776
$ stat -c '%s' file | numfmt --to=si
311K
$ stat -c '%s' file | numfmt --to=iec
304K
$ stat -c '%s' file | numfmt --to=iec-i
304Ki
$ stat -c '%s' file | numfmt --to=si --suffix=B
311KB

그리고 ksh93:

$ size=$(stat -c %s file)
$ printf "%#d %#i\n" "$size" "$size"
311k 304Ki

또는 ls내장 함수를 사용하여 빌드한 경우( 또한완전 개방팩):

$ type ls
ls is a shell builtin version of /opt/ast/bin/ls
$ ls -Z '%#(size)d %#(size)i' file
311k 304Ki

답변2

스크립트가 필요하지 않습니다 du -d 0 -t 2200M -h /some/dir/name/*. .

예. du모든 파일을 표시 하는 데 사용됩니다 ./쓰레기통보다 낫다500000:

du -d 0 -t 500K -h /bin/*

산출:

1.1M    /bin/bash
620K    /bin/btrfs
2.0M    /bin/busybox
1.6M    /bin/ksh93
788K    /bin/zsh

sort-h위의 항목을 크기별로 정렬하는 무료 서비스가 있습니다 .

du -d 0 -t 500K -h /bin/* | sort -h

산출:

620K    /bin/btrfs
788K    /bin/zsh
1.1M    /bin/bash
1.6M    /bin/ksh93
2.0M    /bin/busybox

답변3

착한 사람여기당신에게 도움이 될 수 있는 해결책을 생각해냈습니다:

find . -type f -size +2G -exec ls -sh {} \; 2> /dev/null

사람이 읽을 수 있는 형식으로 완벽하게 정렬된 완전한 경로 이름과 크기를 제공합니다.

네가 원한다면2.2G그러면 find소수를 처리할 수 없으므로 수학을 좀 해야 하고(2048 + 205 =) 2253M

find . -type f -size +2253M -exec ls -sh {} \; 2> /dev/null

매개변수를 사용하여 검색 깊이와 필요한 크기를 제한하고 find( 참조 man find) awk열을 파일이나 배열로 출력하는 데 사용할 수 있습니다.

편집: -lh를 -sh로 변경하고 @Olorin 개선 사항에 따라 awk를 제거했습니다.

답변4

du -h example.txt|cut -f 1

( -h=사람이 읽을 수 있는)

이것은 가정한다당신의"인간의 가독성"이라는 아이디어와컨셉의 취지는 같습니다.

관련 정보