所有文件大小的总和

所有文件大小的总和

我是 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在这种情况下正确打印)。这是替代 do 的方法BEGIN {sum=0}

答案2

使用wc

wc -c * 2> /dev/null

如果只需要总数,请执行以下操作:

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

答案3

如果您正在寻找一种以 bash 为中心的 shell 脚本方法来执行此操作,这里有一个 shell 循环,它收集所有文件(包括点文件),然后使用 GNU coreutils 实用程序stat将它们的大小打印到求和变量中。

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

希望对其他初学者有一点帮助。

相关内容