为了找到创建某些文件所需的平均时间,我使用这个分钟数组,然后简单地使用 bash 算术来找到平均值。但是,除了第一对元素之外,我无法得到差异。这是和l
的减法数组;怎么了?i++
i
MMarray=(`ls -lrt /some/location/ |tail -57|head -55|tr -s " "|cut -d" " -f8|cut -c4,5`)
arrLen=`echo ${#MMarray[@]}`
for((i=0;i<$arrLen;i++))
do
x=$(($i+1))
j=${MMarray[x]#0}
k=${MMarray[i]#0}
l=($(($j-$k)))
echo ${l[$i]}
done
另外,减法如何02-59
处理?
答案1
如果您知道时间不会超过一小时,那么如果结果为负数,您可以简单地添加 60。然而,无论如何这都不是办法。我想提出几点:
- 切勿解析 ls 的输出,尤其是时间部分。它取决于区域设置,并且可能会产生完全不可预测的结果。
- 如果你可以减去日期,为什么要假设时间大约是一个小时,就像分钟一样?使用 unix 时间戳 - 自世界诞生 (1970) 以来的秒数。这是存储时间的标准方式。
- 只需编写
let i++
and 即可let l=j-k
,不要使用数百万个括号 - 您正在创建
$l
一个长度为 1 的数组,然后访问$i
th 成员。这就是为什么它只适用于第一对。 - 您正在使用非常类似 C 的编程风格。使用表单的循环
for i in "${MMarray[@]}"; do...
并保存前一个。 - 您使用了太多的数组和循环,在日期流中完成所有操作,会好得多。所以几乎一切都可以重写。
- 您是否意识到,平均时间只是第一个减去最后一个除以文件数减 1(差异数)?你不需要先减去然后再相加...
如果您想获取所有以秒为单位的时间差(每行一个),该怎么办:
find /some/location -type f -name '*your filter which files you want*' -printf '%T@\n' | sort -n | awk 'NR>1 { print $1-previous } {previous = $1}'
它能做什么?find
查找文件并打印 unix 时间戳。如果您不指定-name
它会列出所有内容。-type f
表示只有文件,没有目录。sort -n
对时间进行数字排序。awk
只需计算并打印差异。
一般来说,只需保留第一个和最后一个日期即可。例如,对于当前目录中的所有文件:
find . -type f -printf '%T@\n' | sort -n | awk 'NR==1 { first = $1 } END{ print ($1-first)/(NR-1) }'
结果是以秒为单位的十进制数字,但您可以轻松地只写int(($1-first)/(NR-1))
整数或int(($1-first)/(NR-1))/60
分钟。