如何使用 Bash 脚本获取目录 /etc 中 .conf 扩展名的字节总大小并将其保存到 total_size.txt 中。
这是我的脚本:-
#!/bin/bash
touch /home/onyic/total_size.txt
echo "$(du -csh -B1 /etc/*.conf)" >> ~/total_size.txt
我知道 echo 实际上只是打印它。这就是为什么我需要你的帮助。
我的脚本的更新版本:-
#!bin/bash
find /etc -name '*.conf' -print0 | du -csh -B1 --files0-from=- | awk 'END {print $1}' >> ~/total_size.txt
答案1
使用这种方法,您将错过 之类的文件/etc/apache2/apache2.conf
,它们位于 的子目录中/etc
。您应该使用find
来选择 的文件du
:
find /etc -name '*.conf' -print0 | du --files0-from=-
然后您可以使用awk
从最后一行获取总数:
find /etc -name '*.conf' -print0 | du --files0-from=- | awk 'END {print $1}'
您已经知道如何将输出放入文件中。
find /etc -name '*.conf' -print0
/etc
列出名称匹配的文件(实际上,任何文件)*.conf
,但每个文件名后都有一个空字节(-print0
)。由于文件名中不允许出现空字节,因此它非常适合分隔文件名。du --files0-from=-
从标准输入 (-
) 读取文件名,文件名由空字节分隔(这就是 e-print0
与 一起使用的原因find
)awk 'END {print $1}'
$1
仅打印最后一行的第一列( )。
答案2
如果您只想要总大小,这是du
输出的最后一行:
$ du -csh -B1 /etc/*.conf
4096 /etc/asound.conf
...
192512 total
您可以使用tail
+cut
来获取该值:
$ du -csh -B1 /etc/*.conf | tail -n1 | cut -f1
192512
tail
取最后一行,cut
取第一列。所以:
du -csh -B1 /etc/*.conf | tail -n1 | cut -f1 >> ~/total_size.txt
顺便说一句,这个文件touch ...
是没用的。如果需要的话,shell 会创建这个文件。
答案3
stat -c %s /etc/*.conf | awk '{total = total + $1}END{print total}' > ~/total_size.txt
或者如果你喜欢“du”,不带 -b 开关的 du 会给出磁盘使用情况,-b 开关会给出文件大小(以字节为单位)。
du --help
用法:du [选项]... [文件]...
-b, --bytes 相当于 '--apparent-size --block-size=1'
du -bc /etc/*.conf | cut -f1 | tail -1 > ~/total_size.txt
区别:
$ du -csh -B1 /etc/*.conf | tail -n1 | cut -f1
208896
$ du -bc /etc/*.conf | cut -f1 | tail -1
108396
$ stat -c %s /etc/*.conf | awk '{total = total + $1}END{print total}'
108396