我是 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
希望对其他初学者有一点帮助。