Se você sabe que os horários não são muito mais de uma hora, você pode simplesmente adicionar 60 se o resultado for negativo. No entanto, esta não é a maneira de fazer isso de qualquer maneira. Existem vários pontos que gostaria de levantar:
- NUNCA analise a saída de ls, especialmente a parte do tempo. Depende do local e pode dar resultados completamente imprevisíveis.
- Por que os tempos presumidos são em torno de uma hora e, assim como nos minutos, se você puder simplesmente subtrair datas? Use o timestamp unix - o número de segundos desde o começo do mundo (1970). Essa é a maneira padrão de armazenar tempo.
- Basta escrever
let i++
elet l=j-k
, não usar milhões de parênteses - Você está transformando
$l
em uma matriz de tamanho 1 e, em seguida, acessar$i
th membro. É por isso que só funciona para o primeiro par. - Você está usando um estilo de programação muito parecido com o estilo c. Use um loop do formulário
for i in "${MMarray[@]}"; do...
e salve o anterior. - Você está usando muitos arrays e loops, faz tudo em um fluxo de datas, será muito melhor. Então, praticamente tudo pode ser reescrito.
- Você percebe que um tempo médio é simplesmente o primeiro menos dividido pelo número de arquivos menos 1 (o número de diferenças)? Você não precisa subtrair e juntar novamente ...
O que fazer se você deseja obter todas as diferenças de tempo em segundos, uma por linha:
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}'
O que isso faz? find
localiza os arquivos e imprime os carimbos de data / hora unix. Se você não especificar -name
, ele listará eveything. -type f
significa apenas arquivos, nenhum diretório. sort -n
ordena os tempos numericamente. awk
simplesmente calcula e imprime diferenças.
Para a média, mantenha apenas a primeira e a última data. Por exemplo, para todos os arquivos no diretório atual:
find . -type f -printf '%T@\n' | sort -n | awk 'NR==1 { first = $1 } END{ print ($1-first)/(NR-1) }'
Os resultados são números decimais em segundos, mas você pode facilmente escrever int(($1-first)/(NR-1))
para um inteiro ou int(($1-first)/(NR-1))/60
para minutos.