此bash脚本每天在cronjob上获取一个CCTV截图。 文件名保存为YY_MM_DD_HH_MM_SS。
我可以使用下面的代码轻松地进行“年初至今”的间隔(显示为sofar.gif
)-请注意,这会忽略所有文件名/创建日期,而只是起诉每个文件夹ffmpeg -pattern_type glob -i $outdir/'*.jpg' $outdir/gif/sofar.gif -y
但是我也想同时使用EITHER生成一个gif: A)使用最新7x文件名的JPG B)带有最新修改图章的JPG (结果相同)
我在下面尝试了此代码,该代码确实生成了7days.gif
,但是它只包含1帧,是最早的第七张屏幕截图-而是我希望的输出具有由最近7倍的最新屏幕截图组成的7帧。
#!/usr/bin/env bash
PATH=/usr/local/bin:/usr/local/sbin:~/bin:/usr/bin:/bin:/usr/sbin:/sbin
# 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
mkdir $outdir/gif/
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 'http://192.168.1.69/cgi-bin/snapshot.cgi?chn=0&u=XXX&p=XXX&q=0&d=1&rand=0.14620004288649113' -o $file) ; then
echo "Captured & saved $file!"
else
echo "Failed to capture $file"
fi
# THIS IS THE BIT WHICH DOES THE LAST 7 DAYS
shopt -s nullglob
files=( "$outdir"/*.jpg )
file_count=${#files[@]}
echo
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
echo "Making weekly.."
echo "${input_args[@]}"
echo "Making weekly.."
ffmpeg "${input_args[@]}" $outdir/gif/7days.gif -y
echo "Making YTD.."
ffmpeg -hide_banner -loglevel panic -pattern_type glob -i $outdir/'*.jpg' $outdir/gif/sofar.gif -y
exit 1
一半代码的工作方式就像回显${input_args[@]}
一样,我看到了正确的文件列表。 Making weekly.. -i 365/2019_07_10_15-00-00.jpg -i 365/2019_07_11_15-00-00.jpg -i 365/2019_07_12_15-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_15-00-00.jpg -i 365/2019_07_16_12-00-19.jpg
似乎使ffmpeg感到困惑,因为它在-i上一遍又一遍地添加了-i,这意味着gif只包含一帧。
我需要编辑上面的脚本以正确吐出7days.gif
,该脚本是使用$outdir
中最新的7x屏幕截图动态制作的
答案 0 :(得分:1)
如果您需要最新的七个文件,并且文件名中不包含换行符,则可以执行以下操作:
readarray -t files < <( ls -tr | tail -7 )