다른 폴더에있는 .mp4 비디오 파일이 있습니다. 우분투에서 다음 명령을 사용하여 ffmpeg로 모든 비디오 파일을 처리하고 싶습니다 (처리 된 비디오는 새 파일 이름으로 저장 됨).
ffmpeg -i input_video -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 output_video
파일 이름에 “xyz”라는 문자열이 포함 된 모든 .mp4 비디오 파일을 루트 폴더로 재귀 적으로 검색하는 bash 스크립트를 사용하여이 작업을 수행하고 싶습니다 /media/myShare.
또한 때때로 새로운 비디오 파일을 하위 디렉토리에 추가합니다. 스크립트를 다시 실행할 때 이미 변환 된 스크립트를 처리하고 새로 추가 된 스크립트 만 처리하고 싶지 않습니다. 이 모든 것을 어떻게 할 수 있습니까?
도움을 주시면 감사하겠습니다.
답변
스크립트를 작성해야하는 속성이 몇 가지 있습니다. 하나씩 살펴 보도록하겠습니다.
파일 이름에 패턴이있는 모든 MP4 파일을 반복적으로 찾아서 처리합니다.
여기 친구가 있습니다 find-대부분의 옵션이 필요하지 않으므로 라인을 따라 뭔가 find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4'좋은 출발입니다. 당신은 for구조로 이것들을 반복 할 수 있습니다
언급하지 않은 내용 : 새 파일 이름 자동 생성
당신이 사용하려고 할 수 있습니다 basename의 라인을 따라, 그것에 대해 뭔가를 BN=$(basename "$FILEPATH" '.mp4'); BP=$(dirname "$FILEPATH"); NEWFILENAME="$BP/$BN-converted.mp4"좋아 보인다.
함께 모아서
이제 모든 건물 벽돌을 갖추 었으므로 물건을 연결해야합니다.
#!/bin/bash
STARTFOLDER="/media/myShare"
PATTERN="xyz"
MARKER="converted"
echo -n "Finding candidate files .."
FILELIST=$(find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4')
echo ".. "$(echo -e "$FILELIST" | wc -l)" found"
while read FILEPATH; do
# A bit of healthy paranoia
test -z "$FILEPATH" && continue
test -f "$FILEPATH" || continue
echo -n "Working on $FILEPATH .."
# New file name
BN=$(basename "$FILEPATH" '.mp4')
BP=$(dirname "$FILEPATH")
NEWFILEPATH="$BP/$BN-$MARKER.mp4"
# Skip result files
ISRESULT=$(echo "$BN" | grep -e "$MARKER\\.mp4\$")
if test -n "$ISRESULT"; then
echo ".. skipping (is a result file)"
continue
fi
# Skip processed files
if test -f "$NEWFILEPATH"; then
echo ".. skipping (result file exists)"
continue
fi
# Process
echo -n ".. running ffmpeg .."
RES=$(ffmpeg -i "$FILEPATH" -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 "$NEWFILEPATH" </dev/null 2>&1)
echo ".. done (exit code $?)"
done < <(echo -e "$FILELIST")
주의 사항 : 이것은 완전히 테스트되지 않았으며 오타가있을 수 있습니다