2015-06-22 57 views
0

我只想處理10分鐘前最後修改的文件。我正在努力做到這一點。如何在perl中找到幾分鐘較舊的文件

for my $file (<${dir}/*csv>_) { 
    if (-M $file < .0069) { 
     next; 
     } 
    else { 
     code ... 
      } 
    } 

.0069天已計爲10分鐘(10 /(24 * 60))。現在目錄中的文件存在於1天以前的文件中,但是任何小於1天的文件都會被錯誤地識別。例如,如果文件比23小時大,它將在if塊中處理而不是其他處理。 我想`-M $文件'將其值轉換爲整數(即​​在這種情況下爲0)。任何人都可以幫忙嗎?謝謝

附加: 謝謝大家。我正在嘗試使用文件:: Stat

for my $file (<${dir}/*csv>_) { 
    my $mtime = (stat($file))[9]; 
    my ctime = time; 
    my $time_diff = $ctime - $mtime; 

    if ($time_diff < 600) { 
     next; } 
    else { 
     code ... 
      } 
    } 

但是,這並不能提供準確的結果。對於剛創建的文件$ time_diff必須幾乎爲零,但它出現在-17640附近。我想時代不應該是任何問題,因爲兩個時代都是從時代開始計算的。我錯在哪裏? (服務器時間如下IST(+5:30個小時)

} 
+1

'-M $ file'實際返回什麼?你能舉出一些你想要的文件和你不需要的文件的例子嗎? – melwil

+0

目前尚不清楚你的期望。您的代碼將處理超過十分鐘前修改的所有文件,其中包括昨天修改的文件。 – Borodin

+0

@melwil:'-M'返回自文件修改以來的(浮點)天數 – Borodin

回答

1

的代碼編寫工作,應該有幾個可能的原因,它沒有一個當然是熟悉的老浮點不精確,。但是這隻應該接近10分鐘的限制,另一個我認爲更有可能,但是你沒有給出足夠的上下文來肯定地說,-M運算符返回文件時間戳和文件時間戳之間的差異這意味着,例如,在腳本啓動後創建的任何文件將從-M獲得負值,如果您的腳本長時間運行,-M是非常沒用的,如果文件駐留在文件系統上是一個遠程的(NFS或其他),時鐘偏差託管文件系統的服務器和運行腳本的服務器之間的安全性也可能會造成混亂。

我建議你重寫你的代碼直接使用stat()。這樣你可以在幾秒鐘內獲得時間,所以你可以處理整數而不是浮點數,並且可以與當前時間進行比較而不是腳本開始時間。看看perldoc File::stat使使用stat()更具可讀性。

+0

你是什麼意思***「熟悉的舊浮點不準確」***? 32位浮點值精確到約十二位數,或每天約一微秒。這應該是相當不錯的 – Borodin

+1

那麼,例如,海報使用的近似0.0069天實際上是9.936分鐘,而不是十分鐘。在這種情況下可能不相關,但增加幾個近似層次並且可以變得顯着。 –

+1

啊好的。但這不是*浮點錯誤* - 我會打電話*使用錯誤的號碼*! – Borodin

0

你的代碼實際工作: 試圖

for my $file (<*>) { 
    print "File $file\n\t -M: " . (-M $file); 
    if (-M $file < .0069) { 
    print " Doesnt fit\n"; 
    next; 
    } else { 
     print " Fits\n"; 
    } 
} 

在我的/ tmp目錄返回:

File config-err-GBOOnR 
    -M: 0.0935532407407407 Fits 
File cvcd 
    -M: 0.0938425925925926 Fits 
File kde-gm 
    -M: 0.0935300925925926 Fits 
File ksocket-gm 
    -M: 0.0935300925925926 Fits 
File orbit-gm 
    -M: 16608.367650463 Fits 
File unity_support_test.0 
    -M: 0.0935532407407407 Fits 

但你也可以使用stat代替:

my $mtime = stat($file)[9]; 
if(time-$mtime > 10*60) { 
} 

應該做的工作。見

perldoc -f stat 
+0

謝謝..我已經在原來的問題回答了我的查詢.. :) – Ankur

+0

@Ankur:我猜你的機器上有問題。添加一些調試代碼以找出錯誤: 'require Data :: Dumper; warn Data :: Dumper :: Dumper([stat($ file),-M $ file]);' 也許應該會導致你的錯誤 –

0

大多數Linux安裝,其中包括perl可能有更廣義的find2perl程序。

相關問題