Как найти и удалить все файлы определённого формата во всех директориях?
Есть задача: удалить все файлы во всех директориях, удовлетворяющих определённым шаблонам. Например удалить все файлы .md, .json, .txt
Как просканировать директориии рекурсивно на файлы я знаю:
function getDirContents($dir, &$results = array()) {
$files = scandir($dir);
foreach ($files as $key => $value) {
$path = realpath($dir . DIRECTORY_SEPARATOR . $value);
if (!is_dir($path)) {
$results[] = $path;
} else if ($value != "." && $value != "..") {
getDirContents($path, $results);
$results[] = $path;
}
}
return $results;
}
var_dump(getDirContents('./'));
знаю про поиск файлов по маске glob. Т.е. что можно написать
$files = array_merge(glob('*.md'), glob('*.json'), glob('*.txt'));
но никак не могу это совместить.
Как собрать массив файлов для удаления? Чтобы потом в цикле сделать unlink для всех найденных путей?
Ответы (2 шт):
Автор решения: xbt573
→ Ссылка
Ты можешь использовать регулярные выражения.
Пример: *.txt, *.exe, *.любойформат.
Вроде они есть во всех языках.
Автор решения: Сергей О.
→ Ссылка
Получилось как-то так:
$path = __DIR__;
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$allFiles = array_filter(iterator_to_array($iterator), function($file) {
return $file->isFile() && in_array($file->getExtension(), ['md', 'txt', 'json']);
});
foreach ($allFiles as $file) {
unlink($file->getPathname());
}