현재 디렉터리와 하위 디렉터리에서 .mp4로 끝나는 파일 묶음의 지속 시간을 얻으려고 합니다. ffprobe를 사용하려고 합니다. 단순화를 위해 find를 사용하는 대신 ls를 사용합니다. 기간을 초 단위로만 나열해도 괜찮을 것입니다. 모든 내용을 요약하는 것은 아마도 제 범위를 벗어나기 때문입니다!
나의 현재 노력은 다음과 같습니다.
ls -a * |grep .mp4$|xargs ffprobe
이라고 볼 수 있다
입력 파일 이름으로 "SomeVideo.mp4" 매개 변수가 제공되었지만 "DifferentVideo.mp4"가 지정되었습니다.
어떻게 해야 하나요? ffprobe는 한 번에 하나의 파일만 처리할 수 없나요?
답변1
그리고 exiftool
:
$ exiftool -ext mp4 -r -n -q -p '${Duration;$_ = ConvertDuration(our $total += $_)}' . | tail -n 1
4 days 22:14:59
주로 다른 점은매우 유사한 질문에 대한 @don_cristi의 답변, 이는 EXIFtool이 향상된 기능을 갖춘 파일을 -r -ext mp4
재귀적으로 검색할 수 있게 해줍니다 .ext
r
답변2
기본 요구 사항에 따라 파일을 반복하여 한 번에 하나씩 전달해야 합니다 ffprobe
. 이렇게 하면 시간, 분, 초 단위로 기간을 얻을 수 있습니다.
for mp4 in *.mp4
do
echo "Processing $mp4"
ffprobe "$mp4" 2>&1 | awk '/Duration/ {print $2}'
done
좀 둘러봐좀 더 조심스럽게ffprobe
, 초를 직접 전달할 수 있습니다
for mp4 in *.mp4
do
echo "Processing $mp4"
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$mp4"
done
일단 그렇게 하고 나면, 그것들을 모두 합치는 것은 큰 도약이 아닙니다.
for mp4 in *.mp4
do
echo "Processing $mp4"
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$mp4"
done |
awk -F '
{ sec += $1 } # Total time (seconds)
END {
h = int(sec / 3600); # Hours
m = int((sec - (h*3600)) / 60); # Minutes
s = sec - (h*3600) - (m*60); # Seconds
printf "%d (%d hour, %d min, %d sec)\n", sec, h, m, s # Print the result
}
'
마지막으로 현재 디렉터리의 파일뿐만 아니라 모든 하위 디렉터리의 파일도 처리하도록 외부 루프를 수정합니다. 다음 으로 일치하는 하위 디렉터리를 허용하는 bash
기능을 사용하세요.**
shopt -s globstar # Enable extended globbing
for mp4 in **/*.mp4
do
echo "Processing $mp4"
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$mp4"
done |
# Continue as before...
답변3
xargs
명령에 가능한 한 많은 입력 매개변수를 추가합니다. 단일 파일의 한계는 알 수 없습니다.ffprobe
ffprobe
입력당 한 번 실행 하려면 다음을 사용하십시오.
... | xargs -l ffprobe
또는
... | xargs -L 1 ffprobe
이해하려면 이 두 명령의 출력을 비교해 보세요.
seq 1 3 | xargs echo
seq 1 3 | xargs -l echo
-output을 입력으로 사용하는 것은 ls
여러 가지 이유로 권장되지 않습니다.
사용하는 것이 더 좋습니다 find
- 단순화하려는 노력에도 불구하고 NULL
특수 문자 문제를 피하기 위해 구분 기호를 사용하는 것이 더 좋습니다.
find -maxdepth 1 -name '*mp4' -print0 | xargs -0 ffprobe
ffprobe
다음 질문은 - get Seconds only는 did의 출력과 같습니다.여기. 그런 다음 awk
예를 들어 다음 을 사용하여 요약할 수 있습니다 .