微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

解决方法:

#!/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

相当于“$@”中的f;也就是说,它遍历所有命令行参数.如果你想要遍历当前目录中的所有MP4,那么这将是f in * .mp4; do或者循环遍历作为第一个命令行参数传递的目录中命名的所有MP4,它将是“$1”/ *中的f.mp4;做.为了支持这两种用法 – 但是如果没有传递目录则使用第一种用法 – 它将用于“${1: – .}”/ *.mp4;做.
>临时目录使用

因为原始脚本会将/ tmp / gif重用于所有内容,所以您将从其他输入源获取文件.最好通过为每个输入文件创建一个新的临时目录来避免这种情况,mktemp将自动执行该目录.
>创建.gif名称

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

因此,“${f%.*}.gif”剥离现有的扩展名,并添加.gif扩展名.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐