디렉터리 및 하위 디렉터리의 각 파일에 대한 비디오 파일 크기와 비디오 지속 시간의 비율을 계산하는 방법

디렉터리 및 하위 디렉터리의 각 파일에 대한 비디오 파일 크기와 비디오 지속 시간의 비율을 계산하는 방법

Linux에서 BASH 스크립트를 만들고 싶습니다. 지금까지 나는 다음을 가지고 있습니다

#!/bin/bash
for file in $(find "/home/drive1/videos" -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov'); do
  size=$(stat -c%s "$file")
  duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
  ratio=$(echo "scale=2; $size / $duration" | bc)
  echo "$file: size=$size, duration=$duration, ratio=$ratio"
done

하지만 이렇게 하면 오류가 발생합니다.

stat: '/home/drive1/videos/file'을 statx할 수 없습니다. 해당 파일 또는 디렉터리가 없습니다. /home/drive1/videos/file: 해당 파일 또는 디렉터리가 없습니다(standard_in) 1: 구문 오류 /home/drive1/videos/ file : 크기=, 기간=, 규모=

하지만 그냥 실행하면 find

find . -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov'

파일이 표시됩니다.

./file.mov

ffprobe는 다음 명령을 사용하여 비디오 파일의 지속 시간을 초 단위로 표시하므로 작동합니다.

ffprobe -v quiet -of csv=p=0 -show_entries format=duration file.mov 

40.707333

내가 뭘 잘못하고 있는 걸까요? 어떤 아이디어라도 있나요? 도움을 주셔서 미리 감사드립니다!

건배

답변1

대상 파일의 확장자가 올바른지 확인하려면 표현식을 수정하여 괄호를 추가하세요.

find . -type f '(' -name '*.mp4' -o -name '*.avi' -o -name '*.mov' ')'

답변2

문제는 찾기가 아니라 for 루프와 파일 이름의 공백을 처리하는 방법입니다. 나는 while-loops가 이것에 매우 편리하다고 생각합니다:

find "/home/drive1/videos" -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov' | while read -r file
do 
    size=$(stat -c%s "$file")
    duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
    ratio=$(echo "scale=2; $size / $duration" | bc)
    echo "$file: size=$size, duration=$duration, ratio=$ratio"
done

관련 정보