저는 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 sum
0
BEGIN {sum=0}
답변2
사용 wc
:
wc -c * 2> /dev/null
합계만 원할 경우 다음을 수행합니다.
wc -c * 2> /dev/null | tail -1
답변3
이를 수행하기 위한 bash 중심 셸 스크립트 방법을 찾고 있다면 여기에 모든 파일(도트 파일 포함)을 수집한 다음 stat
GNU 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
이것이 다른 초보자들에게 도움이 되기를 바랍니다.