2016-11-23 3 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

Просто посчитайте ваши файлы и перерыв; foreach, когда осталось всего 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

Спасибо, Veve, я думаю, что в вашем источнике есть небольшая ошибка: вы забыли $ (перед файлами) в «foreach (theFiles as $ fd) {". –

+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);} 
}