
특정 파일을 생성하는 데 걸리는 평균 시간을 찾으려면 이 분 배열을 사용한 다음 간단히 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의 출력, 특히 시간 부분을 구문 분석하지 마십시오. 이는 로케일에 따라 다르며 완전히 예측할 수 없는 결과를 생성할 수 있습니다.
- 날짜를 뺄 수 있다면 왜 시간이 분처럼 약 한 시간이라고 가정합니까? Unix 타임스탬프를 사용하세요 - 세계가 창조된 이후(1970년) 초 단위의 시간입니다. 이것이 시간을 저장하는 표준 방법입니다.
- 그냥 쓰고
let i++
,let l=j-k
수백만 개의 괄호를 사용하지 마세요. $l
길이가 1인 배열을 만든$i
다음 번째 멤버에 액세스합니다. 이것이 첫 번째 쌍에서만 작동하는 이유입니다.- 당신은 매우 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
파일을 찾고 유닉스 타임스탬프를 인쇄합니다. 지정하지 않으면 -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
분만 쉽게 쓸 수 있습니다.