我运行一个 cron 作业,请求从本地地址的远程网络摄像头拍摄快照:
wget http://user:[email protected]/snapshot.cgi
每次运行时都会创建文件snapshot.cgi
、、、snapshot.cgi.1
。snapshot.cgi.2
我希望的结果是文件的名称类似于file.1.jpg
, file.2.jpg
。基本上,按顺序或日期/时间命名的文件,并使用正确的文件扩展名,而不是.cgi
。
有任何想法吗?
答案1
你可能要折磨 wget 才能做到这一点,但何必呢?试试
wget http://user:[email protected]/snapshot.cgi
mv snapshot.cgi snapshot-`date +%Y-%m-%d-%H%M%S`.jpeg
这应该会创建带有日期和时间戳的图像,如snapshot-2011-04-12-081649.jpeg
。这样可以吗?
编辑:好的,不需要太多折磨:
wget -O snapshot-`date +%Y-%m-%d-%H%M%S`.jpeg http://user:[email protected]/snapshot.cgi
但我大部分还是喜欢使用小型、独立的工具的 UNIX 方式来完成这件事。
答案2
您可以使用简单的 bash 循环和-O
wget 中的选项来完成此操作。
像这样:
i=0
while 1
do
# increment our counter
((i++))
# get the file and save it
wget -O file.$i.jpg http://user:[email protected]/snapshot.cgi
# presumably you want to wait some time after each retrieval
sleep 30
done
一个明显的烦恼是,如果目录中已经有 file.1.jpg 并且您启动此脚本,它将被覆盖。为了解决这个问题,您首先需要找到所有现有的 file.N.jpg 文件,找到 N 的最大值,然后从 N+1 开始。这是一个难以置信愚蠢的方法来做到这一点:
# find the last sequential file:
i=$(ls -t file.*.jpg | head -1 | awk -F. '{ print $2}')
# if there weren't any matching files, force $i to 0
[ $i > 0 ] || i=0
# increment by one to get your starting value for $i
((i++))
# and then start your capture mechanism
while 1
do
# increment our counter
((i++))
# get the file and save it
wget -O file.$i.jpg http://user:[email protected]/snapshot.cgi
# presumably you want to wait some time after each retrieval
sleep 30
done
我真的应该将整个过程重写为 perl 单行代码,但我很累而且时间很晚了,所以我会偷懒。无论如何,这应该能让您了解如何使用简单的 shell 脚本机制来实现这一点。