158416
757249
574994
144436
520739
210444
398630
1219080
256965
684782
393445
157957
273642
178980
339245
6014031
这些是我当前目录中的文件大小。我使用以下命令获取了它们:
ls -l | tr -s " " | cut -d " " -f5 | tail +2
无论如何,我可以仅使用cut, echo, eval, head, ls, tail, tr
命令添加所有 15 个这些大小来获取所有文件的总大小
答案1
从该命令列表中,没有一个可以将数字相加,因此我认为必须使用 shell 的算术扩展。
就像是:
echo "$(($(LC_ALL=C ls -nq | tr -s ' ' | cut -d ' ' -f5 | tail -n +2 | tr '\n' +)0))"
(这里假设没有一个文件是设备文件,其输出ls -l
没有第五列中的大小,而是设备主编号)。
ls -l
请注意,或的输出因语言环境而异,并且在/ls -n
之外的语言环境中未指定。C
POSIX
此外,如果没有-q
,它将无法适用于名称或符号链接目标包含换行符的文件。
不使用-q
将相当于任意命令注入漏洞您是否会在某人可以创建具有恶意名称的文件的目录中运行该命令(例如ln -s $'\nx x x x a[$(reboot)0]' x
在不带 的情况下运行后尝试-q
)
您希望获得用户/组名称-n
而不是可能包含空格字符的 id。-l
-l
请注意,它tail +2
已被弃用。标准语法是tail -n +2
.
答案2
将您的号码放入名为“file.txt”的文件中,然后
var=$(cat file.txt)
echo $((${var//$'\n'/+}))
基本上,心律失常表达式的模式采用以下形式:
${parameter//find/replace}
,或者在我们的示例中为${var// /+}
。这是Bash 参数扩展:
- `\n` will add blank spaces between the numbers in the list
- The double slashes `//` are for replacing all occurrences of space with `+` sign, if you put one slash `/`, only first space is going to be replaced. The space is there because you are replacing space with plus sign.
之前的解决方案可以简化如下:
var=echo $(< file.txt)
echo $((${var// /+}))
然而,这两种解决方案都存在以下问题:命令替换这可能会修剪尾随换行符
更多的这里
答案3
使用粘贴和 bc :
$ paste -sd + file | bc
12283035
答案4
使用 bash$(( ))
进行算术运算:
ACC=0
for i in $(command to get sizes); do ACC=$((i + ACC)); done
echo $ACC