如果$ 5
中没有参数,我很难让这段代码输出0ls -AFl | sed "1 d" | grep [^/]$ | gawk '{ if ($5 =="") sum = 0; else sum += $5 } END { print sum }'
当我在没有任何文件的目录中运行此行时,它会输出换行符,而不是0。 我不明白为什么?如何在目录中没有文件的情况下输出0,任何帮助都将不胜感激,谢谢。
答案 0 :(得分:1)
您可以将awk
命令更改为:
gawk 'BEGIN { sum = 0 } $5 { sum += $5 } END { print sum }'
即。仅在sum
阻止时将0
初始化为BEGIN
并仅在sum
非空时汇总$5
。
答案 1 :(得分:0)
这是实现目标的另一种方式:
stat * 2&>/dev/null | awk '/Size/ && !/directory/ { sum += $2 } END { print (sum ? sum : 0) }'
这使用awk来解析stat
的输出。 shell将*
扩展为当前目录中所有内容的名称。如果目录为空,stat
会产生错误,该错误会发送到/dev/null
。
awk脚本为包含" Size"的行添加第二列的值。但不是"目录",因此包含文件和符号链接。如果您只想统计文件,可以将!/directory/
更改为/regular file/
。
三元运算符? :
表示sum
是"是",打印sum
,否则打印0
。如果目录为空,则未定义sum
,因此将打印0
。
正如评论中所提到的,将sum
强制转换为数字的更简洁方法是使用print sum+0
,或者使用一元+
运算符print +sum
。在这种情况下,要么使用完全正常,尽管许多人建议在更复杂的情况下使用+sum
。