特定のファイルを生成するのにかかる平均時間を見つけるには、この分配列を使用してから、単に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
時間が1時間を超えないことを知っていれば、結果が負の数であれば、単に60を足すだけです。しかし、これはとにかく解決策ではありません。私はいくつかの点を指摘したいと思います:
- lsの出力、特に時間部分を解析しないでください。これはロケールによって異なり、完全に予測不可能な結果を生成する可能性があります。
- 日付を引くことができれば、なぜ時間が分のように約1時間であると仮定しますか? Unixタイムスタンプを使用 - 世界が作成されてから(1970年)秒単位の時間。これが時間を保存する標準的な方法です。
- ただ書いて
let i++
、let l=j-k
何百万もの括弧を使用しないでください。 $l
長さ 1 の配列を作成し、次の$i
メンバーにアクセスします。これが最初のペアでのみ機能する理由です。- あなたは非常にCに似たプログラミングスタイルを使用しています。フォームのループを使用し
for i in "${MMarray[@]}"; do...
て前のループを保存します。 - あまりにも多くの配列とループを使用しているので、すべての操作を日付ストリームで実行する方がはるかに優れています。したがって、ほとんどすべてを書き換えることができます。
- 平均時間は、最初のマイナス最後のマイナスをファイル数マイナス1(差数)で割ったことを知っていましたか?あえて引く必要もなく、加える必要もなく...
すべての時間差を秒単位(1行に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) }'
結果は秒単位の10進数ですが、整数または分だけint(($1-first)/(NR-1))
簡単に書き込むint(($1-first)/(NR-1))/60
ことができます。