Bash 使用目录中最近的7个jpg文件制作gif(ffmpeg)

Bash 使用目录中最近的7个jpg文件制作gif(ffmpeg),bash,ffmpeg,Bash,Ffmpeg,我有一个在cron上运行的bash脚本,每天拍摄我的cctv 1x的屏幕截图,然后每年制作一次timelapse。这一切都很有效,我得到了从第一个屏幕截图到最后一个屏幕截图的YTDsofar.gif,现在已经很长了。我想添加一行代码,使last7days.gif,这样我可以得到一个更短的每周gif等等 我已经搜索过这个网站和网络,可以使用:ls-1t | head-n9 | tail-n7(这会删除最后修改的.gif和.mov)在终端中列出最新的7个文件,但我不知道如何将7个文件名的垂直列表变成

我有一个在cron上运行的bash脚本,每天拍摄我的cctv 1x的屏幕截图,然后每年制作一次timelapse。这一切都很有效,我得到了从第一个屏幕截图到最后一个屏幕截图的YTD
sofar.gif
,现在已经很长了。我想添加一行代码,使
last7days.gif
,这样我可以得到一个更短的每周gif等等

我已经搜索过这个网站和网络,可以使用:
ls-1t | head-n9 | tail-n7
(这会删除最后修改的.gif和.mov)在终端中列出最新的7个文件,但我不知道如何将7个文件名的垂直列表变成一个变量,以便使用这些文件名生成gif

# runs from a cronjob. saves live screenshot from CCTV to jpg, then updates the year-to-date movie

if [ $# -ne 1 ]
then
  echo "Usage: `basename $0` OUTDIR"
  exit 65
fi

doexit=0

start=$(date +%s)
end=$(date +%s)

outdir=${1%/}
mkdir $outdir
echo "Capturing image..."

counter=$(date +"%Y_%m_%d_%H-%M-%S");
file=$outdir/$counter.jpg

if response=$(curl --silent --write-out %{http_code} --max-time 600 'URL REDACTED' -o $file) ; then
    echo "Captured & saved $file!"
else
    echo "Failed to capture $file"
fi

ffmpeg -hide_banner -loglevel panic -pattern_type glob -i $outdir/'*.jpg' $outdir/sofar.mov -y
ffmpeg -hide_banner -loglevel panic -pattern_type glob -i $outdir/'*.jpg' $outdir/sofar.gif -y

exit 1
目前,最后几行使用每个图像文件创建一个.gif文件,这只是因为它们与文件名中的日期一起保存


我想添加一行代码,仅使用最近的7幅图像创建.gif。在shell中进行全局搜索,然后您可以获取所需的任何子集:

#!/usr/bin/env bash
#              ^^^^- NOT /bin/sh; array support is required.

shopt -s nullglob
files=( "$outdir"/*.jpg )
file_count=${#files[@]}

if (( ${#files[@]} == 0 )); then
  echo "ERROR: No files found" >&2; exit 1;
elif (( ${#files[@]} > 7 )); then
  files=( "${files[@]:$(( ${#files[@]} - 7 ))}" )
fi

input_args=( )
for f in "${files[@]}"; do
  input_args+=( -i "$f" )
done

ffmpeg "${input_args[@]}" "$outdir/sofar.gif"

这是相关的。虽然。。。文件名排序以将它们按正确的顺序排列?这是哪个版本的bash?(允许从一个范围的末尾使用负数进行索引是否足够新?);哇,非常感谢,我能理解其中的逻辑,并且已经读了一些东西;nullglob,files[@]再次感谢。但是当它运行时,它会给出一个错误
“-i:没有这样的文件或目录”
。我试图找出答案,注意到当我从
输入参数+=(-I“$f”)
行中删除
-I
时,我确实看到了ffmpeg在终端中回显的最新7个文件名,但生成的.gif只是文件列表的第一帧/一帧样本。文件名与修改日期完全匹配<代码>2019年07月15日19-30-00.jpg 2019年07月14日19-30-00.jpg 2019年07月13日19-30-00.jpg 2019年07月12日19-30-00.jpg 2019年07月11日19-30-00.jpg 2019年07-10日19-30-00.jpg 2019年07-09日19-30-00.jpg如果我回显
{<代码>每周制作-i 365/2019_07_10_15-00-00.jpg-i 365/2019_07_11_15-00-00.jpg-i 365/2019_07_12-00-00.jpg-i 365/2019_07_13_15-00-00.jpg-i 365/2019_07_14_15-00-00.jpg-i 365/2019_07_15-00-00-00.jpg-i 365/2019_07-00-00-00-00-00.jpg-i 365/2019_16_12-00-00-00.jpg
会产生错误
365/2019_07_11_15-00-00.jpg,:没有这样的文件或目录
问题是在
“${input_args[@]}”展开之前的初始
-i
,因此您得到了
-i
。顺便说一句,一个很好的开始是运行一个带有
bash-x
的脚本,这样它会记录它执行的每一行。请参阅我已经对代码所做的更改,这将修复该错误。(您可以单击“n分钟前编辑”链接查看更改内容和更改时间)。