我有以下脚本(名为vid2gif.sh)将视频文件转换为gif:
#! /bin/bash
ffmpeg -i $1 /tmp/gif/out%04d.gif
gifsicle --delay=10 --loop /tmp/gif/*.gif > $2
我可以使用命令转换文件:
vid2gif.sh myvid.mp4 myvid.gif
如何将其转换为文件夹中的所有mp4文件?也就是说,如何进行以下命令工作:
vid2gif.sh *.mp4
脚本应将文件输出为* .gif。谢谢你的帮助。
答案 0 :(得分:2)
#!/bin/sh
for f; do
tempdir=$(mktemp -t -d gifdir.XXXXXX)
ffmpeg -i "$f" "$tempdir/out%04d.gif"
gifsicle --delay=10 --loop "$tempdir"/*.gif >"${f%.*}.gif"
rm -rf "$tempdir"
done
让我们回顾一下这是如何运作的:
迭代
for f; do
相当于for f in "$@"
;也就是说,它遍历所有命令行参数。如果您希望遍历当前目录中的所有MP4,这将是for f in *.mp4; do
,或者循环遍历作为第一个命令行参数传递的目录中的所有MP4,它将是for f in "$1"/*.mp4; do
。为了支持这两种用法 - 如果没有传递目录,请使用第一种用法 - 它将是for f in "${1:-.}"/*.mp4; do
。
临时目录使用
因为原始脚本会对所有内容重用/tmp/gif
,所以您可以从其他输入源获取文件。最好为每个输入文件创建一个新的临时目录,mktemp
将自动执行。
创建.gif
名称
"${f%.*}"
是一个参数扩展,它删除文件中最后一个.
之后的所有内容;有关bash中字符串操作的文档,请参阅BashFAQ #100,包括此特定表单。
因此,"${f%.*}.gif"
会删除现有的扩展程序,并添加.gif
扩展名。