2016-11-23 85 views
0

我在一個目錄中有幾個(存檔)備份文件;以「backup-」開頭的文件名。刪除所有文件,但保留最新的文件

我想刪除所有比7天更早的文件,但應該總是有一個文件(最新),否則我沒有備份文件了。

我有源代碼(見下文)將刪除所有文件早於7天,但如何始終保持最新的文件在目錄中?所以,剩下的可以超過7天(如果這是最新的)。

$bu_days=7; 
$files="backup*.tar.gz"; 

foreach(glob($filter) as $fd) { 
    if(is_file($fd) && time() - filemtime($fd) >= $bu_days*24*60*60) {unlink($fd);} 
} 
+0

只是計數的文件和突破;什麼時候只剩下1個文件? – Thomas

+0

在刪除任何東西之前,你必須做一些測試。 – RST

+1

如果您的問題已解決,請將相應答案標記爲解決方案(而不是將「已解決」添加到問題標題中)。 –

回答

1

您可以按日期對文件進行排序,然後刪除所有,但第一:

$bu_days=7; 
$files="backup*.tar.gz"; 

//retrieve all files 
$theFiles = glob($files); 

//combine the date as a key for each file 
$theFiles = array_combine(array_map("filemtime", $theFiles), $theFiles); 

//sort them, descending order 
krsort($theFiles); 

//remove the first item 
unset($theFiles[0]); 

foreach($theFiles as $fd){ 
    if(is_file($fd) && time() - filemtime($fd) >= $bu_days*24*60*60) {unlink($fd);} 
} 
+0

Thanks Veve,我認爲你的源代碼中有一個小錯誤: 你在「foreach(theFiles as $ fd){」中忘記了$(before theFiles)。 –

+1

而不是「first = true」等你可以使用「unset(array [0])」,它會從陣列中刪除它 –

+0

@ni_hao你是對的,我用你的小費編輯了我的答案,該解決方案不需要爲每個文件多次訪問文件日期。 – Veve

0

續期來源:

//declare after how many days files are too old 
$bu_days=7; 

//declare how many files always should be kept        
bu_min=3; 

//define file pattern 
$files="backup*.tar.gz"; 

//retrieve all files 
$theFiles = glob($files); 

//combine the date as a key for each file 
$theFiles = array_combine($theFiles, array_map("filemtime", $theFiles)); 

//sort array, descending order (newest first) 
arsort($theFiles); 

//return subset of the array keys 
$f = array_keys($theFiles); 

// keep the first $bu_min files of the array, by deleting them from the array 
$f = array_slice($theFiles, $bu_min); 

// delete every file in the array which is >= $bu_days days 
foreach($theFiles as $fd){ 
    if(is_file($fd) && time() - filemtime($fd) >= $bu_days*24*60*60) {unlink($fd);} 
} 
相關問題