扩展脚本以循环多个文件并生成输出名称

我有以下脚本(名为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 

让我们来看看这是如何工作的:

  1. 迭代

     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

  2. 临时目录使用

    因为原来的脚本会重用/tmp/gif的一切,你会从其他人使用一个输入源的文件。 最好通过为每个输入文件创建一个新的临时目录来避免这个问题,这个mktemp会自动执行。

  3. 创建.gif名称

    "${f%.*}"是一个参数扩展,它将删除最后一切. 在一个文件中; 一般来说,参见BashFAQ#100,了解有关bash中字符串操作的文档,包括这个特殊的表单。

    因此, "${f%.*}.gif"剥离了现有的扩展名,并添加了一个.gif扩展名。