2009-08-28 44 views
1

我有一個Perl腳本,我爲自己的個人使用而編寫,它定期從網站獲取圖像文件。然後它將這些圖像保存到一個文件夾中。這些圖像文件在抓取到抓取時經常是相同的,如果我能解決它,我不想保存重複。如何判斷兩個圖像文件在Perl中是否相同?

我的問題:是什麼比較/檢查,如果它們是相同的最好方法?

我唯一真正的想法到目前爲止是打開的文件句柄現有之一,它的MD5,MD5從$響應 - >內容的獲取,然後對它們進行比較。這會起作用嗎?

有沒有更好的方法?

編輯:

哇,已經很多偉大的建議。如果我告訴你這個腳本每天通過cron運行,它會有幫助嗎?即它保證始終每天在同一時間運行?另外:我正在查看其中一些最後修改的標題,並且它們看起來並不是100%準確的,也就是說,有一些最近修改了一個多星期前,當我知道該圖像是更新的比起那個來說。我猜想這是因爲圖像文件本身尚未在服務器上,因爲再修改......這不利於我很多......

回答

5
  • 不要每次打開和散列存儲的圖像 - 當存儲圖像時將散列存儲在圖像旁邊。比較大小以及。

  • 不要發出GET請求馬上,首先做一個頭部和大小,最後修改日期和任何ETag時比較你得到了什麼最後一次。

+0

還沒有實現,但我越玩越多,我越發現這是正確的解決方案。我將存儲上次運行的標題信息,然後與此運行的信息進行比較以確定是否獲取。感謝所有幫助。 – Morinar 2009-08-28 19:18:34

1

MD5會的工作,但你還是要拉文件。 HTTP標頭,內容長度,緩存控制指令,ETags等有沒有有用的元數據?

+1

不幸的不是。拉文件並不是一個真正的問題,只是不想用dups填滿我的HD。 – Morinar 2009-08-28 18:31:41

+0

恥辱。如果你需要比散列整個文件更優化的東西,我會認爲你可以只讀第一個n KB並進行比較。你可能不得不嘗試找到一個體面的n值。 – cms 2009-08-28 18:41:24

+0

現在我更仔細地看這些,我有etags和內容長度。我認爲*在任何情況下。 – Morinar 2009-08-28 18:58:48

1

沒錯那sounsd權利。 根據您獲取文件的方式以及您可能能夠檢查HTTP 304 Not Modified的頻率並保存下載。

3

有一些HTTP頭,您可以使用此 - 如果您保存您上次檢索到的文件的時候,你可以做一個有條件的GET與

If-Modified-Since: <date> 

或者,如果服務器的響應返回的ETag頭,可以存儲與圖像(或者你已經看到該圖像的的ETag的集合),然後執行:

If-None-Match: <all of your etags here> 

如果服務器支持條件得到,然後喲你會得到一個「304沒有修改」的迴應,沒有任何內容。

0

還有爲宗旨不錯fdupes工具。不知道您使用的是什麼系統,以及該工具可以爲哪些系統構建。

相關問題