我有一个在cron上运行的bash脚本,每天拍摄我的CCTV 1x的屏幕快照,以进行年度间隔拍摄。一切正常,我得到了第一个屏幕快照到最后一个屏幕快照的YTD sofar.gif
-现在已经很长了。我想添加一行以制作last7days.gif
,这样我可以得到更短的每周gif等。
我已经搜索了该站点和网络,并可以使用以下命令在终端中列出最新的7个文件:ls -1t | head -n 9 | tail -n 7
(这将删除最后修改的.gif和.mov),但我不知道该如何做将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
答案 0 :(得分:3)
在外壳中进行遍历,然后可以获取所需的任何子集:
#!/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"