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

时间:2015-02-18 01:24:29

标签: linux bash shell

我有以下脚本(名为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。谢谢你的帮助。

1 个答案:

答案 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

让我们回顾一下这是如何运作的:

  1. 迭代

    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

  2. 临时目录使用

    因为原始脚本会对所有内容重用/tmp/gif,所以您可以从其他输入源获取文件。最好为每个输入文件创建一个新的临时目录,mktemp将自动执行。

  3. 创建.gif名称

    "${f%.*}"是一个参数扩展,它删除文件中最后一个.之后的所有内容;有关bash中字符串操作的文档,请参阅BashFAQ #100,包括此特定表单。

    因此,"${f%.*}.gif"会删除现有的扩展程序,并添加.gif扩展名。