2009-01-22 39 views
1

我有followign bash腳本來更新mtimes的郵件目錄文件:郵件目錄標題問題

#!/bin/bash 

for i in /test/emailfile 

do 
    date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i") 
    newdate=$(date -d "$date" +'%Y%m%d%H%M.%S') 
    touch -t "$newdate" "$i" 
done 

這個腳本一直運行良好,與標準的頭這樣的:

Delivery-date: Sun, 22 Apr 2007 00:15:13 -0600 
Received: from an-out-0708.google.com ([209.85.132.243]) 
    by x.xxxx.com with esmtp (Exim 4.63) 
    (envelope-from <[email protected]>) 
    id 1HfVLs-0002Io-RQ 
    for [email protected]; Sun, 22 Apr 2007 00:15:13 -0600 

其中有一個2007郵寄日期。如果我觸摸該文件,以便文件日期從今天開始,然後運行我的腳本,則文件日期將恢復爲接收日期。

然而,當試圖用下面的標題上的電子郵件運行我的腳本:

Delivery-date: Mon, 15 Dec 2008 17:26:37 -0800 
Received: from xxxxxx ([130.194.13.165]) 
    by xxxxxxx with esmtp (Exim 4.69) 
    (envelope-from <[email protected]>) 
    id 1LCOhp-0006fm-2g 
    for [email protected]; Mon, 15 Dec 2008 17:26:37 -0800 

的日期apparantly不會恢復。我看不出標題在任何方面都明顯不同。我需要重置mtimes,因爲許多郵件客戶端使用文件時間顯示爲從時間接收。我的腳本已處理超過3000封電子郵件,確保所有客戶端在移動服務器和具有相同日期的所有文件之後以正確順序顯示電子郵件,但出於某種原因,它不適用於特定電子郵件。我是否在腳本中留下了明顯的東西?

編輯:日期顯然是從腳本恢復的,但依賴於mtimes的客戶端不會顯示此消息,無論腳本如何設置日期。權限與佈局和文件名格式相同。以下是來自ls -la的信息

-rw-rw---- 1 username username 11769 Dec 14 21:25 1229318728.H329820P11297.xxxxx.serverxxxxx.com:2,S 
-rw-rw---- 1 username username  3366 Dec 15 17:26 1229390797.H476913P25671.xxxxx.serverxxxxx.com:2,S 
-rw-rw---- 1 username username  1149 Dec 22 05:39 1229953142.H901034P11016.xxxxx.serverxxxxx.com:2,S 
-rw-rw---- 1 username username  7557 Dec 23 15:43 1230075791.H700954P8392.xxxxx.serverxxxxx.com:2,S 

將無法​​正確顯示的文件是從頂部開始的第二個。有什麼方法可以調試爲什麼會發生這種情況?

回答

1

它似乎對我來說很好,試試這個小小的小玩意,看看你得到什麼。

#!/bin/bash 
echo 'Delivery-date: Sun, 22 Apr 2007 00:15:13 -0600 
Received: from an-out-0708.google.com ([209.85.132.243]) 
    by x.xxxx.com with esmtp (Exim 4.63) 
    (envelope-from <[email protected]>) 
    id 1HfVLs-0002Io-RQ 
    for [email protected]; Sun, 22 Apr 2007 00:15:13 -0600' | sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' 
date -d "Sun, 22 Apr 2007 00:15:13 -0600" +'%Y%m%d%H%M.%S' 
echo 'Delivery-date: Mon, 15 Dec 2008 17:26:37 -0800 
Received: from xxxxxx ([130.194.13.165]) 
    by xxxxxxx with esmtp (Exim 4.69) 
    (envelope-from <[email protected]>) 
    id 1LCOhp-0006fm-2g 
    for [email protected]; Mon, 15 Dec 2008 17:26:37 -0800' | sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' 
date -d "Mon, 15 Dec 2008 17:26:37 -0800" +'%Y%m%d%H%M.%S' 

我得到(預期):

Sun, 22 Apr 2007 00:15:13 -0600 
200704221415.13 
Mon, 15 Dec 2008 17:26:37 -0800 
200812161026.37 

所以我不知道爲什麼你不工作,雖然該腳本的輸出應該是一個很好的起點。

你能做的就是臨時修改腳本如下的另一件事:

: : : : : 
echo touch -t "$newdate" "$i" 
touch -t "$newdate" "$i" 
: : : : : 

這將輸出你想實際的命令。

還檢查目錄和單個文件的文件權限。

什麼是「ls -l」(mtime)和「ls -lc」(ctime)在實際的可疑郵件文件上給你?這可能是你的腳本工作正常vut用戶電子郵件客戶端不使用mtime/ctime。

編輯後:

引用「但是依靠mtimes客戶端不會不管什麼腳本設置日期,顯示此消息」,我的回答是,客戶端是依靠mtimes。

解釋Sherlock自己,一旦你消除了所有其他的可能性,不管怎麼說,不管怎麼說,一定是這種情況。還有一件事我注意到了:你是否剛剛說過這個消息根本沒有被顯示(或者我認爲我們正在討論的是錯誤的日期)?

如果是後者,您需要查看郵件客戶端以查看它實際從哪裏獲取日期。只是出於興趣,客戶是否覺得迄今爲止,它是(和它的頭內匹配任何日期?

如果是前者,這是一個不同的問題,我們可以討論。

我認爲這是(客戶端)你需要從這裏出發,因爲我的專業知識比電子郵件客戶端更像腳本編程,所以我可能無法進一步提供幫助。不過,我很想看看它是如何實現的,所以我最喜歡這個問題

+0

是否有任何理由,如果文件的日期發生變化,客戶端將不會顯示更新的時間?或者在所有電子郵件開始時顯示的內容? – 2009-01-22 11:51:44

0

你確定 - 它適合我。

我所做的唯一變化是:

#!/bin/bash 

for i in "[email protected]" 

do 
    date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i") 
    newdate=$(date -d "$date" +'%Y%m%d%H%M.%S') 
    touch -c -t "$newdate" "$i" 
done 

touch -c,使文件不要被觸摸創建。

for i in "[email protected]"因此它在命令行參數而不是固定文件上運行。

$ touch data2 ; ls -l data2 
-rw-r--r-- 1 leeder leeder 250 2009-01-22 11:43 data2 
$ bash test.sh data data2 ; ls -l data2 
-rw-r--r-- 1 leeder leeder 250 2008-12-16 01:26 data2 
1

以下腳本使用日期而不是郵件消息的接收日期屬性,它將日期設置爲與某些郵件應用程序使用的日期相匹配,並簡化了sed語句,還包括改進錯誤處理時遇到錯誤/無效的日期。

#!/bin/bash 
echo "Process folder : [email protected]" 
for i in $(ls -1 [email protected]) 
do 
# date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i") 
# date=$(sed -n -f ~/scripts/fix.sed "$i") 
    date=$(sed -n '/^Date:/{s/^Date: //p;q}' "$i") 
    newdate=$(date -d "$date" +'%Y%m%d%H%M.%S') 
    returnCode=$? 
    if [ "$returnCode" != "0" ] 
    then 
     echo "Date Return Code : $returnCode" 
     echo "Message file : $i received at : $date" 
    fi 
touch -c -t "$newdate" "$i" 
done