Bash 当使用ffmpeg在文件名中遇到空白时,如何避免批处理视频转码错误
我正在运行bash脚本,使用find和ffmpeg在LAMP服务器上对视频进行批转码Bash 当使用ffmpeg在文件名中遇到空白时,如何避免批处理视频转码错误,bash,ffmpeg,Bash,Ffmpeg,我正在运行bash脚本,使用find和ffmpeg在LAMP服务器上对视频进行批转码 dir="/srv/videos" for OUTPUT in "$(find $dir -iname *.AVI -o -iname *.MOV)" do ffmpeg -i "$OUTPUT" "${OUTPUT%%.*}.mp4" -hide_banner done 如果文件有空格,ffmpeg将返回错误 /srv/videos/file with white spaces.MOV: No
dir="/srv/videos"
for OUTPUT in "$(find $dir -iname *.AVI -o -iname *.MOV)"
do
ffmpeg -i "$OUTPUT" "${OUTPUT%%.*}.mp4" -hide_banner
done
如果文件有空格,ffmpeg将返回错误
/srv/videos/file with white spaces.MOV: No such file or directory
对于没有空格的文件,它可以正常工作。如果我在引号内打印文件名,它看起来应该可以工作
for OUTPUT in "$(find $dir -iname *.MOV)"; do echo "$OUTPUT";done
返回
/srv/videos/file with white spaces.MOV
我需要修改什么以避免错误
编辑
将“”添加到${OUTPUT%%.*}.mp4,我得到了相同的错误并更正了扩展名大写(mov到mov)您可以尝试摆脱for循环,只需使用find命令,例如下面的smth命令:
find $dir -iname *.AVI -o -iname *.MOV | while read line; do ffmpeg -i "$line" ${line%%.*}.mp4 -hide_banner; done
您可以尝试摆脱for循环,只需使用find命令,例如smth,如下所示:
find $dir -iname *.AVI -o -iname *.MOV | while read line; do ffmpeg -i "$line" ${line%%.*}.mp4 -hide_banner; done
您需要在
${OUTPUT%%.*}.mp4
周围加引号。错误消息返回时包含整个文件名,这是因为您引用了输入选项-请使用正确引用的相同文件名手动尝试调用。也许ffmpeg
有一个bug?另一个问题-您的find
正在查找*.MOV
,但您的错误消息是/srv/videos/file with white spaces.MOV
-我假设您使用的是windoze系统(和我一样)。如果您更改案例,它是否可以手动工作,但如果您不更改案例,它仍然会失败?(我会很惊讶,但我肯定会检查一下。)识别代码中的几个问题,并且它的报告包含足够的信息,可以引导您找到一个好的解决方案。${OUTPUT%%.*}
可能会删除太多的输出
字符串${OUTPUT%.*}
将仅删除.avi'或.mov`(或.mov
,…)。您需要在${OUTPUT%.*}.mp4
周围加引号。错误消息返回时包含整个文件名,这是因为您引用了输入选项-请使用正确引用的相同文件名手动尝试调用。也许ffmpeg
有一个bug?另一个问题-您的find
正在查找*.MOV
,但您的错误消息是/srv/videos/file with white spaces.MOV
-我假设您使用的是windoze系统(和我一样)。如果您更改案例,它是否可以手动工作,但如果您不更改案例,它仍然会失败?(我会很惊讶,但我肯定会检查一下。)识别代码中的几个问题,并且它的报告包含足够的信息,可以引导您找到一个好的解决方案。${OUTPUT%%.*}
可能会删除太多的输出
字符串${OUTPUT%.*}
将只删除.avi'或.mov`(或.mov
,…)。