Получить весь файл все подпапки и все скрытые файлы с глобусом

В моей функции recurive для архивирования целых папок у меня есть этот кусок кода ($path. '/*'), Который дает мне все файлы и подпапки, соответствующие моему $ path.

Здесь я прочитал, что с помощью glob я могу получить даже скрытые файлы ".filename" с помощью glob('{,.}*', GLOB_BRACE). Как объединить в одном выражении мои потребности? Я пытался использовать glob('{/,.goti*', GLOB_BRACE), но выдает только те файлы, которые я пробовал glob('{/,.----‹*', GLOB_BRACE), но получаю сумасшедшие результаты

Я уже фильтруюсь. а также..

Как слить

glob($dir . '/*') 

а также

    glob('{,.}*', GLOB_BRACE)

5 ответов

Чтобы получить все папки / файлы (даже скрытые):

$result = glob($path . '{,.}[!.,!..]*',GLOB_MARK|GLOB_BRACE);

Это предотвратит листинг "." или ".." в результате.

Вы пробовали это?

glob($path. '/{,.}*', GLOB_BRACE);

Я отвечаю здесь, если кто-то еще смотрит, как это выглядит высоко в Google.

Решение 1 - только глобус

При этом используется глобус, специально предназначенный для пропуска '.' и '..' специальные каталоги. Это соответствует всему, что:

  • не скрывается с "."
  • скрыто с "." но следует не "." персонаж
  • начинается с "..", но после него есть хотя бы один символ
$globbed = glob("{*,.[!.]*,..?*}", GLOB_BRACE);
var_dump($globbed);

Решение 2 - глобиноре

Эта функция имитирует поведение globignore в bash.

function globignore(array $ignore, $glob, $glob_flags = 0)
{
    $globbed = glob($glob, $glob_flags);
    return array_filter($globbed, function ($f) use ($ignore)
    {
        $base = basename($f);
        foreach($ignore as $i)
        {
            if ($i == $base) return false;
        }
        return true;
    });
}
$globbed = globignore(['.','..'], "{*,.*}", GLOB_BRACE);
var_dump($globbed);

Похоже, они выполняются почти в одно и то же время в моей системе. Решение 1 требует меньше кода, но решение 2 легче включить больше терминов, чтобы игнорировать.

Это возвращает скрытые файлы и папки, но не . или же ..:

glob($dir . '/{,.}*[!.]', GLOB_MARK | GLOB_BRACE);

Вместо ответа Houmams он возвращает действительное имя файла ...file.ext также.

Протестировано с $dir="test/" и следующие файлы:

test/.hiddenfolder/
test/folder/
test/...file
test/...file.ext
test/.h
test/.hiddenfile
test/file
test/file.ext

Дополнительная информация
Хуман пытался нацелиться . или же .. с участием [!.,!..], но так как это символьный класс, то невозможно нацеливать строки определенной длины. Это означает [!.] а также [!..] идентичны и предназначены для обеих строк, не содержащих неограниченное количество точек (., .., ..., .... и т. д.). Из-за этого я использовал [!.] только. Таргетирование строк возможно только с помощью фигурных скобок, таких как {jpg,png}, Вы найдете хорошее объяснение в комментариях php.net.

glob() метод возвращает массив. Так что если вы хотите объединить два разных glob Результаты...

$merged = array_merge(glob($dir . '/*'), glob('{,.}*', GLOB_BRACE));

Возможно, вы уже нашли решение, но если вы искали способ, который дает вам файлы и каталоги, рекурсивно и заботясь о скрытых файлах, это было то, что я получил:

function rglob($pattern, $flags = 0) {
    $files = glob($pattern, $flags);

    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
        $files = array_merge($files, $this->rglob($dir.'/'.basename($pattern), $flags));
    }

    return $files;
}
Другие вопросы по тегам