Bash에서 여러 크기의 파일 합계를 계산합니다.

Bash에서 여러 크기의 파일 합계를 계산합니다.

파일에 파일 목록이 있습니다 cache_temp.

파일 내 cache_temp:

/home/maildir/mydomain.com/een/new/1491397868.M395935P76076.nm1.mydomain.com,S=1740,W=1777
/home/maildir/mydomain.com/een/new/1485873821.M199286P14170.nm1.mydomain.com,S=440734,W=446889
/home/maildir/mydomain.com/td.pr/cur/1491397869.M704928P76257.nm1.mydomain.com,S=1742,W=1779:2,Sb
/home/maildir/mydomain.com/td.pr/cur/1501571359.M552218P73116.nm1.mydomain.com,S=1687,W=1719:2,Sa
/home/maildir/mydomain.com/td.pr/cur/1498562257.M153946P22434.nm1.mydomain.com,S=1684,W=1717:2,Sb

다음에서 파일 크기를 가져오는 간단한 스크립트가 있습니다 cache_temp.

#!/bin/bash

for i in `grep -v ^# ~/cache_temp | grep -v "dovecot.index.cache"`; do
    if [ -f "$i" ]; then
        size=$(du -sh "$i" | awk '{print $1}')
        echo $size
    fi
done

파일 크기 목록이 있습니다.

4,0K
4,0K
4,0K
432K
4,0K

그 합을 어떻게 계산할 수 있나요?

답변1

stat다음 대신 사용하세요 du:

#!/bin/bash

for i in `grep -v ^# ~/cache_temp | grep -v "dovecot.index.cache"`; do
     [ -f "$i" ] && totalsize=$[totalsize + $(stat -c "%s" "$i")]
done
echo totalsize: $totalsize bytes

답변2

du(1)에 따르면 총합계를 생성하는 것이 목적인 -c 옵션이 있습니다.

% du -chs * /etc/passwd
92K ABOUT-NLS
196K    NEWS
12K README
48K THANKS
8,0K    TODO
4,0K    /etc/passwd
360K    total

답변3

파일을 사용해야 하는 경우 이 조각이 효율적이기를 바랍니다.

xargs -a cache_file stat --format="%s" | paste -sd+ | bc -l

이는 인수 제한을 초과하는 것을 방지하지만 매번 xargs한 번의 호출로 최대 파일 수를 가져오는 것입니다 .stat

답변4

음... 좋든 나쁘든, 여기에 이것을 구현한 내용이 있습니다. 나는 항상 파일에서 줄을 읽을 때 "while"을 사용하는 것을 선호했습니다.

#!/bin/bash

SUM=0
while read file; do
    SUM=$(( $SUM + $(stat $file | awk '/Size:/ { print $2 }') ))
done < cache_temp
echo $SUM

아래 janos의 권장 사항에 따라:

#!/bin/bash

while read file; do
    stat $file
done < cache_temp | awk 'BEGIN { s=0 } $1 == "Size:" { s=s+$2 } END  { print s; }'

관련 정보