Bash 使用目录中最近的7个jpg文件制作gif(ffmpeg)
我有一个在cron上运行的bash脚本,每天拍摄我的cctv 1x的屏幕截图,然后每年制作一次timelapse。这一切都很有效,我得到了从第一个屏幕截图到最后一个屏幕截图的YTDBash 使用目录中最近的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个文件名的垂直列表变成
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.jpg19.jpg,这似乎是因为它增加了一个密码,所以没有出现这样的错误。删除-i并添加逗号,
会产生错误365/2019_07_11_15-00-00.jpg,:没有这样的文件或目录
问题是在“${input_args[@]}”展开之前的初始-i
,因此您得到了-i
。顺便说一句,一个很好的开始是运行一个带有bash-x
的脚本,这样它会记录它执行的每一行。请参阅我已经对代码所做的更改,这将修复该错误。(您可以单击“n分钟前编辑”链接查看更改内容和更改时间)。