현재 폴더에 있는 모든 미디어의 지속 시간 합계

현재 폴더에 있는 모든 미디어의 지속 시간 합계

폴더에 여러 개의 미디어(정확히 말하면 비디오)가 있고 모든 길이를 요약하고 싶습니다. 지금은 요점을 파악하기 위해 몇 초와 몇 시간을 무시하겠습니다. 나는 다음 스크립트를 작성했습니다.

sum=0
for file in *
do
curr=$(exiftool $file |
   grep -i "^Duration" |
   awk '{print $3}' |
   cut -d':' -f 2)
((sum = sum + curr))
done
echo $sum

하지만 정말 느리고 어떻게든 더 빠르게 만들 수 있는지 알고 싶습니다(또는 변경할 수 있는지, 다르게 할 수 있는지 알고 싶습니다).

그 뒤에 있는 논리는 매우 간단합니다. 디렉터리의 각 파일을 반복하고, 기간이 있는 줄을 잡고, awk 분리 시간(hh:mm:ss) 형식을 사용하고, ':'를 구분 기호로 사용하여 분을 분리합니다. 프로세스의 분을 합산하고 합계를 인쇄합니다. 나는 zsh기록을 사용합니다.

답변1

이를 다음과 같이 단순화할 수 있습니다.

exiftool -n -q -p '${Duration;$_ = ConvertDuration(our $total += $_)}' ./*(-.) |
   tail -n 1

(에 따르면디렉토리에 있는 비디오 파일의 총 재생 시간을 가져옵니다.*(-.), 기호 링크를 일반 파일 또는 일반 파일로 제한하기 위해 를 사용하고 있기 때문에 여기에서 사용됩니다 zsh.

여기서 지속 시간은 -n원시 초를 얻으므로 올바르게 계산되며 합산 후에 멋진 형식만 수행합니다.

그럼에도 불구하고 느린 부분은 대부분 그 자체 때문일 가능성이 높습니다 exiftool. 적어도 여기서는 한 번만 호출되므로 몇 가지 개선이 필요합니다.

또한 합계는 합계 와 awk동시에 수행될 수 있으므로 직접 계산을 수행할 수 없는 경우에도 단순화할 수 있습니다.grepcutexiftool

exiftool -q -n -Duration ./*(-.) | awk -F: '{sum += $2}; END{print sum/60}'

총 기간(분)입니다.

관련 정보