我有一堆 .mp4 视频文件,它们位于不同的文件夹中。我想在 Ubuntu 上使用以下命令用 ffmpeg 处理所有这些视频文件(处理后的视频将以新文件名存储):
ffmpeg -i input_video -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 output_video
我想用一个 bash 脚本来执行此操作,该脚本以递归方式搜索文件名中包含字符串“xyz”的所有 .mp4 视频文件,并将其作为我想使用的根文件夹/media/myShare
。
此外,我时不时地会将新的视频文件添加到子目录中。当我重新运行脚本时,我不想处理已经转换的文件,而只处理新添加的文件。如何才能做到这一点?
任何帮助将不胜感激。
答案1
你的脚本必须具备几个属性,让我们一一介绍一下:
递归查找文件名中带有模式的所有 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")
警告:这完全没有经过测试,可能会出现拼写错误