Получить весь файл все подпапки и все скрытые файлы с глобусом
В моей функции 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);
Это предотвратит листинг "." или ".." в результате.
Я отвечаю здесь, если кто-то еще смотрит, как это выглядит высоко в 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;
}