【发布时间】:2021-12-15 17:43:46
【问题描述】:
我们有一个软件包,它通过为一批文件分配一个作业编号来执行任务。批处理中可以包含任意数量的文件。然后将文件存储在类似于以下的目录结构中:
/asc/array1/.storage/10/10297/10297-Low-res.m4a
...
/asc/array1/.storage/3/3814/3814-preview.jpg
文件名是自动生成的。 .storage中的目录是文件号的千分位。
还有一个将工作编号和文件编号与相关客户相关联的数据库。运行 SQL 查询,我可以列出作业编号、客户端和文件的完整路径。示例:
213 sample-data /asc/array1/.storage/10/10297/10297-Low-res.m4a
...
214 client-abc /asc/array1/.storage/3/3814/3814-preview.jpg
我的任务是计算每个客户端使用的总存储空间。因此,我编写了一个快速而肮脏的 bash 脚本来遍历每一行和 du 文件,并将其添加到关联数组中。然后,我计划将其回显出来或生成一个 CSV 文件,以便摄取到 PowerBI 或其他一些工具中。这是处理这个问题的最好方法吗?这是脚本的副本:
#!/bin/sh
declare -A clientArr
# 1 == Job Num
# 2 == Client
# 3 == Path
while read line; do
client=$(echo "$line" | awk '{ print $2 }')
path=$(echo "$line" | awk '{ print $3 }')
if [ -f "$path" ]; then
size=$(du -s "$path" | awk '{ print $1 }')
clientArr[$client]=$((${clientArr[$client]}+${size}))
fi
done < /tmp/pm_report.txt
for key in "${!clientArr[@]}"; do
echo "$key,${clientArr[$key]}"
done
【问题讨论】:
-
对文件的每一行调用
awk三次、echo两次和du一次总是要花很长时间。尝试运行您需要运行一次的任何内容,并在一次调用awk、python或数据库中累积结果。 -
您的问题中是否存在实际问题?
-
最好的方法是在您的数据库中添加一个包含文件大小的列。
-
@MarkRansom 遗憾的是,数据库是由软件控制的。不过,我可以与他们讨论将其添加为一项功能。