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