有效地使用' for循环'在一系列日期:bash脚本

时间:2015-11-04 00:59:36

标签: linux bash for-loop imagemagick raspberry-pi

我有一个bash脚本,我正在用于我一直在研究的摄影项目。简而言之,我每天都会用Raspberry Pi相机拍摄日出照片。它将这些图片压缩并压缩成电影并将其上传到我的Dropbox帐户。然后我在家里有另一个Raspberry Pi下载电影,并将它们变回静态图片。我正在使用Image Magick程序对这些图片进行剪辑,以便在一个漂亮的网格中进行布局。它完成后应该非常漂亮。

问题是我的bash脚本效率很低,需要做大量工作才能准备好。我有限的编程知识是一个障碍。我的脚本发布在下面。

照片位于按日期(YYYYMMDD)标记的文件夹中,照片本身按日期标记并排序(YYYYMMDD-0001.jpg,YYYYMMDD-0002.jpg等)。每个文件夹中有1440张图片。

我有一个for循环,它遍历我识别为变量的每个文件夹。我更希望有一个for循环来查找日期范围内的每个文件夹(20151001 - 20161001)。有没有更有效的方式来写这个?我一直在寻找一些东西,但我还没有好运。

非常感谢任何帮助!

DA="20151001/20151001-";  
DB="20151002/20151002-";  
DC="20151003/20151003-";  
DD="20151004/20151004-";  
DE="20151005/20151005-";  
DF="20151006/20151006-";  
DG="20151007/20151007-";  
DH="20151008/20151008-";  
DI="20151009/20151009-";  
DJ="20151010/20151010-";  
DK="20151011/20151011-";  
DL="20151012/20151012-";  
DM="20151013/20151013-";  
DN="20151014/20151014-";  
DO="20151015/20151015-";  
DP="20151016/20151016-";  
DQ="20151017/20151017-";  
DR="20151018/20151018-";  
DS="20151019/20151019-";  
DT="20151020/20151020-";  


counter=10000  
for f in ${DA}*.jpg; do  
let "counter+=1"  

#Image Magick Montage lays the pictures out in a 10X2 grid.  
montage -tile 10x2 -geometry +1+1 ${DA}${counter:1}.jpg ${DB}${counter:1}.jpg ${DC}${counter:1}.jpg ${DD}${counter:1}.jpg ${DE}${counter:1}.jpg ${DF}${counter:1}.jpg ${DG}${counter:1}.jpg ${DH}${counter:1}.jpg ${DI}${counter:1}.jpg ${DJ}${counter:1}.jpg ${DK}${counter:1}.jpg ${DL}${counter:1}.jpg ${DM}${counter:1}.jpg ${DN}${counter:1}.jpg ${DO}${counter:1}.jpg ${DP}${counter:1}.jpg ${DQ}${counter:1}.jpg ${DR}${counter:1}.jpg ${DS}${counter:1}.jpg ${DT}${counter:1}.jpg /media/KINGSTON/montage${counter:1}.jpg  
done

3 个答案:

答案 0 :(得分:1)

所以你问最快的方法是只通过2015100120161001?我会这样做:

counter=10000  
for d in 20*; do
    if [ 20151001 -le $d ] && [ $d -le 20161001 ]; then
        for f in $d/$d-*.jpg; do
            let "counter+=1"
            montage -tile 10x2 -geometry +1+1 ${DA}${counter:1}.jpg ${DB}${counter:1}.jpg ${DC}${counter:1}.jpg ${DD}${counter:1}.jpg ${DE}${counter:1}.jpg ${DF}${counter:1}.jpg ${DG}${counter:1}.jpg ${DH}${counter:1}.jpg ${DI}${counter:1}.jpg ${DJ}${counter:1}.jpg ${DK}${counter:1}.jpg ${DL}${counter:1}.jpg ${DM}${counter:1}.jpg ${DN}${counter:1}.jpg ${DO}${counter:1}.jpg ${DP}${counter:1}.jpg ${DQ}${counter:1}.jpg ${DR}${counter:1}.jpg ${DS}${counter:1}.jpg ${DT}${counter:1}.jpg /media/KINGSTON/montage${counter:1}.jpg  
        done
    fi
done

我只进入满足20151001< = $ d< = 20161001的目录。

答案 1 :(得分:1)

最简单的方法可能是使用awk的范围模式:

format/2

答案 2 :(得分:0)

另一个选项可能是使用date命令从开始日起的任意天数生成日期,例如,将日期提前一天比开始日期更早:

date -d '2015/10/01 +1 day'
Fri Oct 2 00:00:00 BST 2015

现在您可以使用+%Y%m%d格式化您想要的格式,因此它变为:

date -d '2015/10/01 +1 day' +'%Y%m%d'
20151002

所以,如果你想要全年,从2015/10/01开始一天一次,你可以做到

for i in {0..365}; do
   date -d "2015/10/01 +$i days" +'%Y%m%d'
done

如果你想在变量中使用它,你可以这样做:

for i in {0..365}; do
   folder=$(date -d "2015/10/01 +$i days" +'%Y%m%d')
   echo $folder
done