2015-11-04 50 views
1

我有一個bash腳本,我正在使用它用於我一直在研究的攝影項目。總之,我有一個樹莓派相機每天拍攝日出的照片。它將這些圖片壓縮成一部電影並上傳到我的Dropbox帳戶。然後我在家裏有另一個樹莓派下載電影,並把它們變成靜止圖片。我正在使用程序Image Magick來製作這些圖片的蒙太奇,以便它們排列在一個漂亮的網格中。完成後它應該很漂亮。高效地在一系列日期中使用'for循環':bash腳本

問題是我的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 

回答

1

所以你問過20161001通過20151001以最快的方式只有循環?我會做這樣的:

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
可能是使用awk的範圍模式

最簡單的方法目錄:

for f in $(ls | awk '/20151001/,/20161001/') 
do 
    # sorry, I'll leave the montage command to you ! 
    ls $f/$f*.jpg 
done 
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 
+0

這是否解決了您的問題?如果是這樣,請考慮接受它作爲您的答案 - 通過點擊投票計數旁邊的空心綠色勾號/複選標記。如果沒有,請說出什麼不起作用,以便我或其他人可以進一步幫助您。謝謝。 –