有關定時下載某頁面的圖片....並自動辨識日期

本區專門提供 Mac OS X 使用者交換使用心得

版主: ross_ttbryanchangdigdogchester

回覆文章
內容
發表人
safinafan
基本會員
文章: 83
註冊時間: 02/24/2005 6:21 pm
聯繫:

有關定時下載某頁面的圖片....並自動辨識日期

#1 文章 safinafan »

我必須下在衛星的圖檔,該衛星圖檔大約是半小時會發佈一張,而且時間不一定,我主要的目的是自動去下載並且與前一張最新下載的圖作比較如果檔案大小一樣的話該圖檔就刪除。

我目前作法是:
第一步是
/usr/bin/curl http://www.nrlmry.navy.mil/archdat/paci ... LATEST.jpg -s -o ~/Documents/Satellite/"`date`.jpg" 2>&1 > /dev/null
第二步
/usr/bin/curl http://www.nrlmry.navy.mil/archdat/paci ... LATEST.jpg -s -o ~/Documents/Satellite/"0000.jpg" 2>&1 > /dev/null

也就是說0000.jpg的檔案要去和前一張的圖片(`date`.jpg)比較是否相同,如果相同的話就刪除0000.jpg的檔案

小弟目前碰到的問題是我要用甚麼指令可以去讀取上一張最新的圖片,並且作比較???

可以法麻煩有經驗的大大提供給小弟做一個參考嗎???
Safina Fan
Mail:safina388@gmail.com
Department Military of Meteorology「D.M.M.」
留言五百如一日
文章: 610
註冊時間: 12/25/2001 1:01 am

#2 文章 »

比較檔案,可考慮指令 diff 或 cmp。

若 a.jpg 別於 b.jpg,則:

代碼: 選擇全部

cmp a.jpg b.jpg

a.jpg b.jpg differ: char 3858, line 70

代碼: 選擇全部

diff a.jpg b.jpg
Binary files a.jpg and b.jpg differ

若 b.jpg 同於 c.jpg,則:

代碼: 選擇全部

diff b.jpg 
不傳回信息。


又,圖檔依 ISO8601 命名較佳。

代碼: 選擇全部

curl 'http://www.nrlmry.navy.mil/archdat/pacific/western/tropics/ir_color/LATEST.jpg' -o ~/Desktop/"`date +%Y%m%dT%H%M%S`.jpg"
safinafan
基本會員
文章: 83
註冊時間: 02/24/2005 6:21 pm
聯繫:

#3 文章 safinafan »

悲 寫:比較檔案,可考慮指令 diff 或 cmp。

我看不太懂你的意思,我嘗試了一下,好像也比較不出來耶???

我有去看了cmp and diff指令的說明,我研究一下如果不懂在post上來

若 a.jpg 別於 b.jpg,則:

代碼: 選擇全部

cmp a.jpg b.jpg

a.jpg b.jpg differ: char 3858, line 70

代碼: 選擇全部

diff a.jpg b.jpg
Binary files a.jpg and b.jpg differ

若 b.jpg 同於 c.jpg,則:

代碼: 選擇全部

diff b.jpg 
不傳回信息。


又,圖檔依 ISO8601 命名較佳。

代碼: 選擇全部

curl 'http://www.nrlmry.navy.mil/archdat/pacific/western/tropics/ir_color/LATEST.jpg' -o ~/Desktop/"`date +%Y%m%dT%H%M%S`.jpg"
Safina Fan
Mail:safina388@gmail.com
Department Military of Meteorology「D.M.M.」
頭像
ulysses
討論區管理員
文章: 2475
註冊時間: 05/18/2001 1:01 am
來自: Forgotten Realm
聯繫:

#4 文章 ulysses »

上次跟你說過一個大概的做法。先決條件是你同意檔案按照年月日時分的命名規則,例如 200605050831.jpg

事前準備:你先建立一個目錄,專門用來放檔案和你的 Shell script。你的 Shell Script 要存成一個叫做 000000000001.sh 的檔案,放進那個目錄裡。Schell Script 內容如下:

代碼: 選擇全部

#!/bin/sh
MYDIR="這裡填上你要放檔案的目錄,注意必須是絕對路徑不能用 ~/Desktop"
NEWFILE="$MYDIR/000000000000.jpg"
MYURL="這裡填上你要抓的檔案 URL"
if curl -s $MYURL -o $NEWFILE
then
	if diff -q $NEWFILE "$MYDIR/`ls | tail -n1`" > /dev/null
	then
		rm -f $NEWFILE
	else
		mv $NEWFILE "$MYDIR/`date +%Y%m%d%H%M`.jpg"
	fi
fi
Shell Script 運作原理:

1. 你先用 curl 抓檔案下來,用固定名稱 000000000000.jpg,放進那個目錄裡。

2. 此時,如果你在那個目錄裡面用 ls 指令時,剛剛抓下來的檔案會放在最上面,而之前抓過的檔案,較新的會放在下面。這是 ls 天生依照檔名排序,以及年月日時分檔名的絕對遞加特性。

3. 所以你用 ls | tail -n1 這個兩個指令串接,就可以抓到之前已存檔案中最新的一個檔案的名稱。

4. 在 Linux 裡,用 ` 符號(shift + ~ )就可以把一個指令的輸出當成文字串接到下一個命令。所以第 7 行指令就等同於『把 000000000000.jpg 這個檔案和目錄中最後一個檔案做比對』

5. 之後,如果檔案不同就改名,如果相同就移除。

不過這樣做有一個盲點:如果你在 Proxy 之後,連線失敗時無法正確判斷。因為 Proxy 會回傳一個錯誤的 HTML 頁面,curl 無從分辨。
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.
safinafan
基本會員
文章: 83
註冊時間: 02/24/2005 6:21 pm
聯繫:

#5 文章 safinafan »

ulysses 寫:

代碼: 選擇全部

#!/bin/sh
MYDIR="這裡填上你要放檔案的目錄,注意必須是絕對路徑不能用 ~/Desktop"
NEWFILE="$MYDIR/000000000000.jpg"
MYURL="這裡填上你要抓的檔案 URL"
if curl -s $MYURL -o $NEWFILE
then
	if diff -q $NEWFILE "$MYDIR/`ls | tail -n1`" > /dev/null
	then
		rm -f $NEWFILE
	else
		mv $NEWFILE "$MYDIR/`date +%Y%m%d%H%M`.jpg"
	fi
fi
小弟試了好久,發現原來是code語法錯誤,在讀取自訂變數時必須加雙引號,Ex:"$MYURL"

因為試了好久,又去查技令,發先原來是這麼一回事阿
Safina Fan
Mail:safina388@gmail.com
Department Military of Meteorology「D.M.M.」
safinafan
基本會員
文章: 83
註冊時間: 02/24/2005 6:21 pm
聯繫:

#6 文章 safinafan »

:( :( :( :(

我有一個問題就是>/dev/null這一行.....

我用diff去比較檔案,如果00000000.jpg和目錄裡最近的檔案相同大小時,他不會顯示任何資訊

但是如果兩個檔案不一樣時,他會顯示00000000.jpg和(ex:20060508T1733)differ

but...問題來了..... :( :( :( :(

代碼: 選擇全部


if diff -q "$NEWFILE" "$MYDIR/`ls | tail -n1`" > /dev/null
then
           rm -f "$NEWFILE" 
     else
           mv "$NEWFILE" "$MYDIR/`date +%Y%m%dT%H%M`.jpg"  
     fi
fi 
第一行他是啥意思阿???
他是表示如果兩個檔案大小一樣時,將其結果忽略,並刪除00000000.jpg嗎???

可以麻煩你詳加解說嗎??? :?: :?:

Sorry.... :cry:.....一直麻煩你
Safina Fan
Mail:safina388@gmail.com
Department Military of Meteorology「D.M.M.」
頭像
ulysses
討論區管理員
文章: 2475
註冊時間: 05/18/2001 1:01 am
來自: Forgotten Realm
聯繫:

#7 文章 ulysses »

safinafan 寫:

代碼: 選擇全部

if diff -q "$NEWFILE" "$MYDIR/`ls | tail -n1`" > /dev/null
then
           rm -f "$NEWFILE" 
     else
           mv "$NEWFILE" "$MYDIR/`date +%Y%m%dT%H%M`.jpg"  
     fi
fi 
第一行他是啥意思阿???
他是表示如果兩個檔案大小一樣時,將其結果忽略,並刪除00000000.jpg嗎???
差不多...

diff 這個指令會去實際比對兩個檔案,如果檔案相同就會回傳 0(在 UNIX 上表示『No Error』),如果不同就會回傳 1。前面加上個 if 就表示『No Error』的時候就去執行刪除檔案的動作,否則就把檔案更名。

至於後面的 > /dev/null,是把 diff 產生的『xxx and xxx differ』這一行字扔掉。

比較標準的寫法應該是

代碼: 選擇全部

diff -q "$NEWFILE" "$MYDIR/`ls | tail -n1`" > /dev/null
if [ $? -eq 0 ]
then
    rm -f "$NEWFILE" 
else
    mv "$NEWFILE" "$MYDIR/`date +%Y%m%dT%H%M`.jpg"  
fi
ash nazg durbatuluk, ash nazg gimbatul,
ash nazg thrakatuluk agh burzum-ishi krimpatul.
回覆文章