Как найти и удалить все файлы определённого формата во всех директориях?

Есть задача: удалить все файлы во всех директориях, удовлетворяющих определённым шаблонам. Например удалить все файлы .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());
}
→ Ссылка