创建/打印这个数组有什么问题?

创建/打印这个数组有什么问题?

为了找到创建某些文件所需的平均时间,我使用这个分钟数组,然后简单地使用 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。然而,无论如何这都不是办法。我想提出几点:

  1. 切勿解析 ls 的输出,尤其是时间部分。它取决于区域设置,并且可能会产生完全不可预测的结果。
  2. 如果你可以减去日期,为什么要假设时间大约是一个小时,就像分钟一样?使用 unix 时间戳 - 自世界诞生 (1970) 以来的秒数。这是存储时间的标准方式。
  3. 只需编写let i++and 即可let l=j-k,不要使用数百万个括号
  4. 您正在创建$l一个长度为 1 的数组,然后访问$ith 成员。这就是为什么它只适用于第一对。
  5. 您正在使用非常类似 C 的编程风格。使用表单的循环for i in "${MMarray[@]}"; do...并保存前一个。
  6. 您使用了太多的数组和循环,在日期流中完成所有操作,会好得多。所以几乎一切都可以重写。
  7. 您是否意识到,平均时间只是第一个减去最后一个除以文件数减 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分钟。

相关内容