O que há de errado em criar / imprimir este array?

1

Para encontrar o tempo médio gasto para criar certos arquivos, estou usando essa matriz de minutos, e simplesmente usaria a aritmética bash para encontrar a média. No entanto, não consigo obter a diferença, exceto o primeiro par de elementos. Aqui l é a matriz de subtrações do i++ e i ; o que há de errado?

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

Além disso, como 02-59 subtração seria tratada?

    
por Keyshov Borate 30.01.2015 / 08:59

1 resposta

4

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:

  1. NUNCA analise a saída de ls, especialmente a parte do tempo. Depende do local e pode dar resultados completamente imprevisíveis.
  2. 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.
  3. Basta escrever let i++ e let l=j-k , não usar milhões de parênteses
  4. 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.
  5. 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.
  6. Você está usando muitos arrays e loops, faz tudo em um fluxo de datas, será muito melhor. Então, praticamente tudo pode ser reescrito.
  7. 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.

    
por 30.01.2015 / 09:17