我有以下脚本(名为vid2gif.sh)将video文件转换为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。 谢谢你的帮助。
#!/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
for f in *.mp4; do
,或循环播放作为第一个命令行参数传递的目录中的所有MP4,这将是for f in "$1"/*.mp4; do
for f in "$1"/*.mp4; do
。 为了支持这两种使用方法 – 如果没有传递目录,就去找第一个目录 – 这将是for f in "${1:-.}"/*.mp4; do
for f in "${1:-.}"/*.mp4; do
。
临时目录使用
因为原来的脚本会重用/tmp/gif
的一切,你会从其他人使用一个输入源的文件。 最好通过为每个输入文件创建一个新的临时目录来避免这个问题,这个mktemp
会自动执行。
创建.gif
名称
"${f%.*}"
是一个参数扩展,它将删除最后一切.
在一个文件中; 一般来说,参见BashFAQ#100,了解有关bash中字符串操作的文档,包括这个特殊的表单。
因此, "${f%.*}.gif"
剥离了现有的扩展名,并添加了一个.gif
扩展名。