2016-11-23 7 views
0

ディレクトリに複数の(アーカイブされた)バックアップファイルがあります。 "backup-"で始まるファイル名。すべてのファイルを削除しますが、最新のファイルを保持します

私は7日と言いますが、それより古いファイルはすべて削除したいのですが、常に最新のファイルが1つ残っている必要があります。それ以外の場合は、バックアップファイルはもうありません。

私は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ファイルが残っているときforeach? – 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

おかげでVeve、あなたのソースに小さなエラーがあると思います: "foreach(theFiles as $ fd){"でtheFilesの前に$を忘れました。 "first = true"の代わりに –

+1

を使用すると、 "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);} 
} 
関連する問題