모든 파일 크기의 합

모든 파일 크기의 합

저는 bash를 처음 접했고 모든 파일 크기(하위 디렉터리 제외)를 요약하는 작은 스크립트를 작성해야 합니다. 내 첫 번째 생각은 이 열을 유지하는 것이었습니다 ls -l. 여기에 표시된 grep, du 또는 기타 고급 명령을 사용할 수 없습니다.

$9는 표시 이름의 9열에 해당합니다.

$5는 파일 크기입니다.

ls -l | awk '{if(-f $9) { total +=$5 } }; END { print total }

답변1

GNU find 및 awk 사용:

find . -maxdepth 1 -type f -printf "%s\n" | awk '{sum+=$1} END{print sum+0}'

출력은 파일 크기(바이트)입니다. 마지막 문은 파일이 없는 경우를 처리하는  print sum+0것 이상을 수행합니다 (예: 이 경우 올바르게 인쇄). 이것은 할 수 있는 대안입니다 .print sum0BEGIN {sum=0}

답변2

사용 wc:

wc -c * 2> /dev/null

합계만 원할 경우 다음을 수행합니다.

wc -c * 2> /dev/null | tail -1

답변3

이를 수행하기 위한 bash 중심 셸 스크립트 방법을 찾고 있다면 여기에 모든 파일(도트 파일 포함)을 수집한 다음 statGNU coreutils 유틸리티 middle을 사용하여 해당 크기를 합계 변수에 인쇄하는 셸 루프가 있습니다.

shopt -s dotglob
sum=0
for f in *
do 
  [[ -f "$f" && ! -h "$f" ]] || continue
  sum=$(( sum + $(stat -c "%s" "$f") ))
done
echo $sum

Bash는 심볼릭 링크를 "일반 파일"로 간주하므로 -h테스트에서 이를 건너뛰어야 합니다.

답변4

이것은 매우 기본적인 연습이므로 교사는 더 많은 개발이 필요하고 나중에 find 또는 stat와 같은 더 강력한 명령으로 대체할 수 있는 기본 명령으로 연습하도록 요청했습니다. 그러나 나는 다음과 같은 답을 얻었습니다.

dir=$1
if [ ! -d $dir ]
then 
   exit 1
else

sum=0
cd $dir

(ls -l $dir) > fitxers.txt

C=($(awk '{print $5}' fitxers.txt))

len=${#C[*]}

i=0

while [ $i -lt $len ]
do 
    for element in $(ls $dir)
    do
        if [ -f $element ]
            then
            let "sum = $sum + ${C[$i]}"
            fi 
        (( i++ ))
    done
done
echo $sum
rm -r fitxers.txt
exit 0
fi

이것이 다른 초보자들에게 도움이 되기를 바랍니다.

관련 정보